Цель C: как получить строковый эквивалент или имя переменной вызова аргумента метода

Я хочу создать простой метод, который регистрирует фрейм представления, но также регистрирует имя конкретного ввода представления. Есть ли простой способ получить строковый эквивалент вызываемого представления, помимо ввода строки в качестве аргумента метода?

-(void)printViewFrame:(UIView*)view { 

    NSLog(@"%@'s frame is: origin x: %f, origin y: %f, size x: %f, size y: %f", view ,view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);

}

[self printViewFrame:myView];

ПРИМЕЧАНИЕ: сейчас я просто делаю это, что немного некрасиво:

-(void)printViewFrame:(UIView*)view name:(NSString*)name {

    NSLog(@"%@'s frame: %@",name, NSStringFromCGRect(view.frame));

}

person Mr Wolf    schedule 08.01.2013    source источник
comment
Что вы подразумеваете под «строковым эквивалентом»? Вы можете привести пример?   -  person Carl Veazey    schedule 08.01.2013
comment
да, другими словами, первое, что будет прочитано в моем журнале выше, это myView, за которым следуют исходная точка x, y и размер x, y.   -  person Mr Wolf    schedule 08.01.2013
comment
Просмотреть имя? что это означает?   -  person CRDave    schedule 08.01.2013
comment
Вы ищете способ распечатать имя переменной, переданной методу?   -  person Andrey Chernukha    schedule 08.01.2013
comment
да переменная. Я так думаю, извините, надо было так сказать.   -  person Mr Wolf    schedule 08.01.2013


Ответы (4)


Чтобы получить рамку вида, вы можете использовать NSStringFromCGRect

NSLog(@"%@",NSStringFromCGRect(view.frame));

Но если вы хотите получить имя представления, вам придется передать его как NSString. Вы можете прочитать только адрес указателя в памяти, а не его настоящее имя. Ближе всего к этому вы подойдете

NSLog(@"%@",NSStringFromClass([view class]));

который будет выводить

UIView

person Mick MacCallum    schedule 08.01.2013
comment
Спасибо, что напечатало имя метода. Ищу переменную. - person Mr Wolf; 08.01.2013
comment
@Mrwolfy Ох, я не думаю, что это возможно. - person Mick MacCallum; 08.01.2013

вызов вашего метода

[self printViewFrame:myView];

реализация метода

-(void)printViewFrame:(UIView*)view { 

    NSLog(@"%@ : %@", NSStringFromCGRect(view.frame),NSStringFromClass(view.class));

}
person Talha    schedule 08.01.2013
comment
просто ищу имя переменной. Я легко могу это сделать, но мне нужно ввести имя в виде строки. Мне было интересно, есть ли умный способ запечатлеть это имя. - person Mr Wolf; 08.01.2013
comment
Я отредактировал ответ, проверьте, поможет ли это вам - person Talha; 08.01.2013

Я думаю, что единственный возможный способ реализовать то, что вам нужно, - это записать имя переменной перед вызовом метода -(void)printViewFrame:

person Andrey Chernukha    schedule 08.01.2013

Я не знаю, как это сделать с помощью стандартной функции, но я могу сделать это с помощью макроса:

#define PRINT_NAME(var) NSLog(@"%s", #var)

Затем вы просто вызываете его, и он печатает имя переменной:

PRINT_NAME(view);

Вы также можете использовать это, чтобы получить NSString с нужным именем:

#define GET_NAME_STRING(var) [NSString stringWithFormat:@"%s", #var]

использовать это так:

NSLog(@"frame stuff %f,...., NAME IS %@", frame.x, ..., GET_NAME_STRING(view));

Если вам нужен только один метод (или несколько), вы можете сделать несколько определений, чтобы делать то, что вы хотите:

#define CALL_PRINT(var) NSLog(@"%s", #var); [self printViewFrame:var]

Итак, когда вы звоните

CALL_PRINT(myView);

Он напечатает имя представления, а затем вызовет функцию printViewFrame.

Кроме того, если вы не хотите ничего делать с макросом, там что-то обнаружено: имя UIView который был тронут.

person dreamzor    schedule 08.01.2013
comment
так что он будет печатать просмотр, не так ли? - person Andrey Chernukha; 08.01.2013
comment
я имею в виду, что его результат всегда будет таким же. вид и больше ничего - person Andrey Chernukha; 08.01.2013
comment
ты не понимаешь. спрашивающий хочет узнать, какая именно переменная была передана методу. но поскольку вы распечатываете его ВНУТРИ метода, имя переменной всегда будет отображаться, а это не то, что нужно спрашивающему - person Andrey Chernukha; 08.01.2013
comment
Да, теперь я понял вашу точку зрения. Я не думаю, что это возможно, не делая ничего другого. - person dreamzor; 08.01.2013