#iphone #xcode
#iPhone #xcode
Вопрос:
Я знаю, как сделать для обмена данными между двумя представлениями. Но если я хочу поделиться данными с помощью TabBarController, я потерян.
Это мое IBAction для перехода на мою панель вкладок.
-(IBAction)goToPage2:(id)sender
{
tabController.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:tabController animated:YES];
}
мне нужно поделиться моей NSString * dataStr в моем IBAction в первом представлении моей панели вкладок.
firstView *first = [[firstView alloc] initWithNibName:@"firstView" bundle:nil];
first.dataStr = name.text;
[tabController presentModalViewController:first animated:YES];
этот код не работает.
спасибо
Ответ №1:
Объявите @property в делегате вашего приложения. И вы можете получить доступ к своему делегату приложения из любой точки вашего приложения.
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication ]delegate]
Ответ №2:
Я согласен с тем, что предложил Теренте. Но я рекомендую вам использовать класс данных в этом случае. Использование свойства в Appdelegate не является хорошей практикой. Вы всегда должны использовать класс данных для этого.
Вы создаете класс данных следующим образом:
Вам нужно создать класс данных, в котором вы можете устанавливать свойства переменных или, в вашем случае, массивов (для отображения данных в UITableView). Реализуйте метод класса в классе данных, который проверяет, был создан экземпляр этого объекта или нет. Если нет, то это произойдет. Это что-то вроде этого :
//DataClass.h
@interface DataClass : NSObject {
NSMutableArray *nameArray;
NSMutableArray *placeArray;
}
@property(nonatomic,retain)NSMutableArray *nameArray;
@property(nonatomic,retain)NSMutableArray *placeArray;
(DataClass*)getInstance;
@end
//DataClass.m
@implementation DataClass
@synthesize nameArray;
@synthesize placeArray;
static DataClass *instance =nil;
(DataClass *)getInstance
{
@synchronized(self)
{
if(instance==nil)
{
instance= [DataClass new];
}
}
return instance;
}
Теперь в вашем контроллере просмотра вам нужно вызвать этот метод как :
DataClass *obj=[DataClass getInstance];
И используйте массивы.
Таким образом, вы можете назначать данные, не нарушая AppDelegate, что является хорошей практикой.
Комментарии:
1. Да, конечно. Если вы сочтете это правильным, поддержите ответ и примите его :))
2. @Nitish Я пытаюсь использовать ваш пример для создания класса данных, чтобы совместно использовать массив событий календаря между MainViewController и SecondViewController, который, оказывается, представляет собой табличное представление. Как именно я мог бы «настроить» сам массив, чтобы получить к нему доступ с помощью
DataClass *obj=[DataClass getInstance];
?
Ответ №3:
Я написал длинное руководство по таким проблемам в своем блоге:http://www.hollance.com/2011/04/making-your-classes-talk-to-each-other-part-1 /
Вам нужно найти простой способ, позволяющий вашим контроллерам взаимодействовать друг с другом. В моем руководстве объясняется несколько способов сделать это и каковы преимущества и недостатки каждого подхода. Стоит узнать, как это сделать, потому что эта проблема возникает практически в любом приложении, которое вы напишете.