Вот проще всего. Готовы ли вы разобраться с тем, насколько просто это может быть на самом деле?
Следующий код демонстрирует, как разделить объект данных между двумя контроллерами зрения:
VCOne.h
@interface VCOne : UIViewController {
NSString *mystring;
}
@property (nonatomic, retain) NSString *mystring;
@end
VCOne.m
@implementation VCOne
@syntheize mystring;
-(void)viewDidLoad {
//you probably wouldn't do it here, but just so it has a
//place to live, I'm doing it in viewDidLoad...
VCTwo *two = [[VCTwo alloc] initWithNibName:@"VCTwoView" bundle:nil];
two.mystring = self.mystring;
[self.navigationController pushViewController:two animated:YES];
[two release];
}
-(void)dealloc {
[mystring release];
[super dealloc];
}
VCTwo.h:
@interface VCTwo : UIViewController {
NSString *mystring;
}
//nb the "assign" in the following line where you're probably
//used to seeing "retain"!!
@property (nonatomic, assign) NSString *mystring;
@end
VC Два м.:
@implementation VCTwo
@synthesize mystring;
-(void)viewDidLoad {
self.mystring = @"I set this string inside VCTwo!";
}
-(void)dealloc {
[super dealloc];
}
Хорошо, так! Один контроллер представления имеет NSString, называемый * mystring, и объявляет его как @property с помощью семантики setter retain
. Второй имеет NSString, называемый * mystring, и объявляет его как @property с помощью смысловой семантики assign
(и, что важно, НЕ ОТПУСКАЕТ ее в -(void)dealloc
. Это безопасно для памяти, хотя это зависит от предыдущего VC, не выпускающего объект далеко от текущего!).
Затем, когда первый VC создает второй экземпляр, он назначает свое поле мистификации новому полю VC. Новый VC принимает этот объект и назначает его самостоятельно @property
. Теперь все, что вы делаете с этой переменной в VCTwo, также имеет значение, указанное в VCOne. Теперь они буквально используют этот указатель. Оба контроллера представления имеют ручку на одной и той же части памяти.
Почему бы не использовать retain
внутри VCTwo? Поскольку метод setter, который синтезируется, когда вы говорите, retain
очищает и сбрасывает переменную, когда она установлена. Они становятся отдельными объектами, и они фактически не синхронизируются. Таким образом, вы можете передавать значения между контроллерами представления, но не ссылаться.
Если у вас возникли проблемы с удалением объекта, потому что он освобождается вверх по течению (возможно, в результате предупреждений о памяти), вы всегда можете явно позвонить [mystring retain]
и сохранить его. Просто убедитесь, что вы выпустили его в -(void)dealloc
, если вы это сделаете.
Я не понимаю вопроса. С одной стороны, вы спрашиваете, как передавать информацию между UIViews (я предполагаю, что вы действительно имеете в виду UIViewControllers, а не UIViews), а с другой стороны вы спрашиваете, как выполнять логику на одном, когда кнопка нажата на другую. Можете ли вы предоставить более подробную информацию о том, что вы пытаетесь сделать? – jlehr