Запущенный метод в другом классе работает… наполовину?

#iphone

#iPhone

Вопрос:

 //AppDelegate (In applicationDidEnterForeground)
SomeClass* object = [[SomeClass alloc]init];
[object SomeMethod:nil];

//In SomeClass.h
-(void)SomeMethod:(id)sender;

//In SomeClass.m
-(void)SomeMethod:(id)sender {
    SomeUILabel.text = @"hehehe!!";
}
  

Я установил точку останова в строке SomeUILabel.text, и она прошла. Но SomeUILabel.text не изменился. Можете ли вы сказать мне, чего не хватает?

Комментарии:

1. Где определена ваша SomeUILabel?

2. вы работаете над mainthread?

Ответ №1:

Я предполагаю, SomeClass это контроллер представления? На самом деле вам не следует пытаться управлять контроллером представления таким образом, задача контроллера представления — управлять его представлениями.

Одна вещь, которую вы должны помнить, это то, что основное представление контроллера представления загружается лениво. Если у вас есть файл nib, в котором вы настраиваете, то он будет работать SomeUILabel до тех пор, пока этот файл nib не будет загружен. ……… nil . Это перо не будет загружено до тех пор, пока UIKit не решит, что просмотр необходим. Чрезвычайно хакерский способ проверить, является ли это проблемой, — это NSLog(@"%@", object.view); перед отправкой SomeMethod: сообщения. Это вызовет загрузку представления, поэтому, пока SomeUILabel правильно подключен IBOutlet , это будет работать. Но вам действительно нужно реорганизовать свой код, вот в чем настоящая проблема.

Комментарии:

1. SomeUILabel имеет значение null. Как мне запустить загрузку представления? NSLog(«%@», object.view); вернул ошибку (Передавая аргумент 1 ‘NSLog’ из несовместимого типа указателя)

2. Упс, моя ошибка: NSLog (@»% @», object.view);

3. NSLog Вызова достаточно, чтобы запустить загрузку представления. Хотя это взлом, вы никогда не должны использовать его ни для чего, кроме быстрого теста отладки. Вы также могли бы вызвать [object loadView]; .

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

5. Я бы отправил уведомление и позволил любым контроллерам просмотра, которые заинтересованы в состоянии переднего плана, прослушать его.

Ответ №2:

попробуйте NSLog (@»хехехе!!») Я полагаю, это сработает

Я думаю, вы вызываете метод, в то время как «SomeUILabel» по-прежнему равен нулю

Возможно, вы не создали ярлык, или, если вы загружаете файл xib, вы вызываете метод до загрузки этого файла xib.

Комментарии:

1. SomeUILabel определен внутри SomeClass. Я вызвал someMethod с помощью [self someMethod:nil]; из SomeClass это работает. Когда я вызвал someMethod из AppDelegate, это происходит.

2. добавьте NSLog(@»% @,»SomeUILabel); в свой someMethod. является ли какая-либо метка нулевой?