2014-09-12 5 views
1

Вопрос новичку для гуру Xcode ...Xcode - Обновить текст ярлыка при нажатии кнопки в другом виде

У меня есть два вида. Они оба используют один и тот же пользовательский класс. В view_1 у меня есть кнопка, и когда это будет нажато, будет отображаться view_2. В view_2 У меня есть метка, которая изменит ее текст, когда я нажму кнопку в view_1. На данный момент Label_1 равен нулю, когда я устанавливаю точку останова на нем и поэтому бесполезен. Как я могу обновить этот ярлык, когда я нажимаю кнопку? Ее некоторые фрагменты из моего кода ...

Это мой .h файл:

@interface ViewController : UIViewController 
{ 
    IBOutlet UIButton *buttonSelectTimeInterval; 
    IBOutlet UILabel *labelTimer; 
} 
@end 

Это действие кнопки в моем файле .m:

- (IBAction)startPouring_ButtonClick:(id)sender 
{ 
    labelTimer.text = @"foo"; 
} 

... но мой. m, похоже, не знает labelTimer, так как это «nil». Почему это так? Он создается в файле .h.

Кто-нибудь?

see image for overview

+0

Чувак ее не работал. Потому что, когда вы пытались нажать кнопку из view_1, в это время свойства view_2 не назначаются. Еще одна вещь, которую вы можете открыть view_2 и view_2 viewWillAppear, вы можете назначить текст, который вы хотите установить. –

ответ

0

Вы можете использовать NSNotificationCenter. Поместите это в вас IBAction.

[[NSNotificationCenter defaultCenter] postNotificationName: @ "buttonPressed" object: nil];

И это вашему мнениюDidLoad.

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (selectorhere) name: @ "buttonPressed" object: nil];

где-то в ом

(аннулируется) selectorhere {

labelTimer.text = @ "Foo";

}

+0

Но каково подключение к моей этикетке Label_1, которую необходимо обновить? И что должно быть выбрано? – TommyF

+0

Спасибо! Я разделил свой собственный пользовательский класс на два, поскольку у меня есть два представления, но ваш простой код работает нормально. Большое спасибо! – TommyF

0

Вы можете использовать NSNotificationCenter для этого.
Вот яблочная документация link.

0

Во-первых, ничего не «экземпляр» в файле .h - это только общедоступный список, какие свойства и методы доступны для других классов. Подумайте о файле заголовка как о содержании, но только о том, что класс хочет видеть другим.

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

Как & где вы создаете 2-й вид? Это раскадровка или что-то еще? Первый вид, похоже, не знает, что существует 2-й, поэтому он не сможет увидеть или получить доступ к ярлыку.

View1Class.м

#import View2Class.h 

@implementation View1Class 

- (IBAction)startPouring_ButtonClick:(id)sender { 
    //Instantiate the 2ndView when you need it. 
    // This gives View1 a reference to View2 and its public UILabel. 
    View2Class * my2ndView = [[View2Class alloc] init]; 
    my2ndView.labelTimer.text = @"foo"; 
} 

@end 

Как я уже сказал, это все еще не ясно, как/где вы на самом деле отображение 2-ой вид, хотя, так что выше фрагмент кода является неполным. Вы можете использовать modal с делегатом, или это то, где NSNotificationCenter - полезный вариант. 2-й вид может зарегистрироваться, чтобы получать уведомления & соответственно. Существует множество учебных пособий по созданию 2-го/модального представления и их отображению при нажатии кнопки - вам, вероятно, следует взглянуть на них, чтобы выяснить, как должна выглядеть структура такого приложения. This answer должен получить вас на правильном пути.

Другие конкретные вопросы:

Почему этикетка nil? Потому что не один ...

В этом IBAction, который, кажется, в виде 1:

- (IBAction)startPouring_ButtonClick:(id)sender 
{ 
    labelTimer.text = @"foo"; //this is looking for labelTimer in the clicked view. 
} 

... она ищет свою labelTimer IBOutlet (в этом случае он должен вероятно self.labelTimer.text), а не 2-го вида. Если в первом представлении даже нет IBUutlet UILabel, это еще одна проблема.

Если виды имеют разные функции &, то они, вероятно, не должны быть экземплярами одного и того же пользовательского класса. Если у 1-го представления нет или нет UILabel, он не должен иметь один в своем .h. Если у 2-го представления нет или нет кнопки, у него не должно быть одного в его .h. Если взгляды служат для разных целей, тогда сделайте их разными классами.

КСТАТИ

Поскольку вы используете переменный экземпляр для IBOutlets, вы должны были бы написать свою собственную добытчик & методу сеттера, если вы хотите изменить их значение. Не так ли? Чтобы сделать эти значения доступными для других классов, вам нужно сделать эти методы общедоступными. & положить их в .h. Неправильно использовать экземпляр экземпляра непосредственно с помощью getter/setter, а другие объекты определенно не должны.

Предпочтительным методом является использование @properties для ваших IBOutlets вместо объявления их в качестве переменных экземпляра. Это автоматически создаст методы setter &, резервное хранилище в памяти, а с XCode 4.4 оно автоматически добавит @synthesize, поэтому вам больше не нужно этого делать. Заявляя IBOutlets как «слабой» ссылка предотвращает сохранение циклов & утечку памяти, где вид имеет место на выходы & выходов держат на представление & никогда ничего не уходит, ...

View1Class.h

@interface ViewController : UIViewController 

@property (nonatomic, weak) IBOutlet UIButton *buttonSelectTimeInterval; 

@end 

View2Class.h

@interface ViewController : UIViewController 

@property (nonatomic, weak) IBOutlet UILabel *labelTimer; 

@end 
+0

Большое спасибо за такой тщательный ответ. Я создал новый класс для второго представления, где находится метка.Кстати, я использую раскадровку и сегу. Я добавил NSNotificationCenter в действие для кнопки i View 1. И добавил NSNotificationCenter в viewDidLoad в представлении 2. И добавил селекторный метод в View 2, который обновляет метку. Сейчас работает отлично. Спасибо за все ваши данные :) – TommyF

+0

Но ... допустим, я хочу buttonSelectTimeInterval, когда я нахожусь в View2Class? Теперь, когда эта кнопка является публичным свойством в View1Class, не следует ли теперь получать эту кнопку, импортируя View1Class в View2Class? Я попытался, но это не сработало. ViewController * my1View = [[ViewController alloc] init]; NSString * buttonText = my1View.buttonSelectTimeInterval.titleLabel.text; – TommyF

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