2014-01-09 4 views
4

Возможно ли в объекте c передать логическое значение по ссылке? У меня есть несколько логических свойств, которые мне нужно управлять, поэтому я хотел бы инкапсулировать переключение этих значений в одну функцию, которую я могу вызвать из каждого события нажатия кнопки. Вот один пример:Пропустить логическое значение по ссылке

@interface MyViewController() 
@property (nonatomic) BOOL *sendEmails; 
@end 

Тогда в случае с UIButton мыши, у меня есть вызов метода:

[self updateEmailPreference:self.sendEmails button:self.noEmailsCheckBox]; 

Что вызывает этот метод:

- (void) updateEmailPreference : (BOOL *) b 
         button : (UIButton *) button 
{ 
    if (*b) {*b = NO;} 
    else {*b = YES;} 

    if (*b) { 
     [button setBackgroundImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateNormal]; 
    } else { 
     [button setBackgroundImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal]; 
    } 
} 

Но, к сожалению, это падает на блок if (*b).... Это возможно? Благодаря!

+0

ваш код не имеет никакого смысла. 'if (b)' проверить указатель не null, 'if (* b)' проверить значение, на которое указывает указатель, вам нужно выяснить, какой из них использовать –

+0

Выше будет работать, только если 'sendEmail' * указывает * на BOOL. –

+2

Я не уверен, что это признанный шаблон obj-c. Вам лучше создать класс с булевыми в нем и передать этот класс взад и вперед как возвращаемое значение из вызовов методов. 'NSError' обычно передается, как вы предлагаете, но это все. – Aaron

ответ

2

Возможно лучше сделать:

@interface MyViewController() 
@property (nonatomic) BOOL sendEmails; 
@end 

Для вызова метода:

[self updateEmailPreference:&(self ->_sendEmails) button:self.noEmailsCheckBox]; 

С помощью метода еще:

- (void) updateEmailPreference : (BOOL *) b 
         button : (UIButton *) button 
{ 
    if (*b) {*b = NO;} 
    else {*b = YES;} 

    if (*b) { 
     [button setBackgroundImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateNormal]; 
    } else { 
     [button setBackgroundImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal]; 
    } 
} 

(Обратите внимание, что может привести к путанице о переменной, которая будет использоваться в заявлении вызова. Если это свойство, вы должны использовать ссылку ivar, а не свойство dot-qual, а имя ivar должно иметь префикс _ или нет, в зависимости от того, как объявляются ваши свойства. Или просто используйте локальную переменную и скопируйте значение свойства в нее и из нее по мере необходимости.)

+0

не уверены, что произойдет, но я думаю, что это неопределенное поведение. вам действительно нужно '& (self-> sendEmails)' –

+0

Спасибо. Это в значительной степени то, что я ищу. Тем не менее, я получаю сообщение об ошибке «Адрес запроса свойства» в вызове метода. – Alex

+0

@BryanChen - Да, вы правы - sendEmails нельзя ссылаться через аксессуар. Я отредактировал, чтобы показать исправление. –

1

он разбился, скорее всего, из-за разыменование обнулить указатель, вы должны сделать это указать на какое-то действительное значение

например

@implementation MyViewController 
{ 
    BOOL _sendEmailsVal; 
} 

- (BOOL *)sendEmails 
{ 
    return &_sendEmailsVal; 
} 

также

if (*b) {*b = NO;} 
else {*b = YES;} 

может быть заменен на

*b = !*b; 

на самом деле вам не нужно передавать указатель, он в основном используется, чтобы иметь больше, чем одно возвращаемое значение

@interface MyViewController() 
@property (nonatomic) BOOL sendEmails; 
@end 

- (BOOL) updateEmailPreference : (BOOL) b 
         button : (UIButton *) button 
{ 
    if (b) { 
     [button setBackgroundImage:[UIImage imageNamed:@"checked_checkbox"] forState:UIControlStateNormal]; 
    } else { 
     [button setBackgroundImage:[UIImage imageNamed:@"unchecked_checkbox"] forState:UIControlStateNormal]; 
    } 
    return !b; 
} 

self.sendEmails = [self updateEmailPreference:self.sendEmails button:self.noEmailsCheckBox]; 
+0

Спасибо за это. Я уверен, что это будет работать для одного свойства boolean, но у меня их довольно много. Я пытаюсь написать один метод, который будет работать для любого свойства boolean, которое я передаю ему. – Alex

+0

@ usr55410 Вторая версия должна работать с любым булевым свойством. вы можете заменить 'self.sendEmails' любой переменной bool –

Смежные вопросы