2014-10-20 3 views
0

У меня есть мой AppDelegate метод пытается установить объект в ViewController метод. Мой AppDelegate выглядит следующим образом:Повторный вызов делегата приложения

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    { 
    //Grab a reference to the UISplitViewController 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 

    PatientDetailViewController* patientDetailViewController = [splitViewController.viewControllers lastObject]; 
    splitViewController.delegate = patientDetailViewController; 


    //Grab a reference to the masterviewcontroller and get the first patient in the list. 
    UINavigationController *patientNavController = [splitViewController.viewControllers objectAtIndex:0]; 
    PatientMasterTableViewController *patientMasterViewController = (PatientMasterTableViewController *)[patientNavController topViewController]; 

    Patient* firstPatient = [[patientMasterViewController patientArray] objectAtIndex:0]; 

    //Set it as the detailviews patient. 
    [patientDetailViewController setPatient:firstPatient]; 

    //Set the detail's as the left's delegate. 
    patientMasterViewController.delegate = patientDetailViewController; 
    } 

return YES; 
} 

и способ установить объект выглядит следующим образом:

-(void)setPatient:(Patient *)patient 
{ 

if (![self.patient isEqual:patient]) 
    { 
    self.patient = patient; 

    //Update the UI to reflect the new patient selected from the list. 
    [self refreshUI]; 
    } 
} 

Вопрос, который я имею, что метод setPatient будет называться нон-стоп пока программа не сработает, и я понятия не имею, почему. Может кто-нибудь пролить некоторый свет на это?

+4

Да, это классический бесконечный контур. 'self.patient = patient' совпадает с вызовом' [self setPatient: patient] ' –

+1

Вы внедрили isEqual: для класса Patient? Если нет, этот вызов может не делать то, что вы ожидаете. –

+0

Хороший вызов от @jshier. Хотя рекомендуется (с помощью Apple) использовать instanceVariable при инициализации свойств, вышеуказанный код следует называть только одним дополнительным временем. Маловероятно, что проверка равенства достигает многого, хотя, помимо добавления шума к вашему коду. –

ответ

0

Это:

-(void)setPatient:(Patient *)patient 
{ 
if (![self.patient isEqual:patient]) 
    { 
    self.patient = patient; 

    //Update the UI to reflect the new patient selected from the list. 
    [self refreshUI]; 
    } 
} 

Должно быть:

-(void)setPatient:(Patient *)patient 
{ 
    _patient = patient; 
    [self refreshUI]; 
} 
+2

Нет, он лучше использует базовую переменную экземпляра, чтобы установить значение. –

+0

@nickfalk, да, я согласен. – WMios

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