#iphone #uitableview #uinavigationcontroller
#iPhone #uitableview #uinavigationcontroller
Вопрос:
у меня есть два представления. Первый: FirstViewController Второй: SecondViewController
FirstViewController — это корневой контроллер моего UINavigationController, и внутри FirstViewController у меня есть UITableView. При щелчке на ячейке в UITableView представление переходит к SecondViewController. Внутри SecondViewController у меня есть UILabel. Я хочу присвоить значение этой UILabel ячейке, которая щелкается в FirstViewController при нажатии кнопки «Назад» на панели навигации. Что я должен сделать, чтобы реализовать это?
Я могу передать значение SecondViewController из FirstViewController, создав:
SecondViewController *sv; sv.somestring = someanotherstring;
но не удается реализовать это на SecondViewController для передачи значения в NSString в FirstViewController.
Не могли бы вы мне помочь, пожалуйста?
Спасибо. ae
Ответ №1:
Типичный способ справиться с этим в iPhone SDK — определить протокол делегирования. Например:
@protocol SecondViewControllerDelegate
- (void) viewControllerWillDisappearWithLabelText: (NSString*)text;
@end
Затем вы должны добавить delegate
свойство к своему SecondViewController
, например:
//in the .h file
@interface SecondViewController : UIViewController {
//declare instance variables
}
@property(nonatomic, assign) id<SecondViewControllerDelegate> delegate;
@end
//in the .m file
@implementation SecondViewController
@synthesize delegate;
//[code...]
@end
Затем вы должны обновить FirstViewController
для реализации протокола делегирования:
//in the .h file
@interface FirstViewController : UIViewController<SecondViewControllerDelegate> {
//[instance variables]
}
//[methods and properties]
@end
//in the .m file
@implementation FirstViewController
//[code...]
- (void) viewControllerWillDisappearWithLabelText: (NSString*)text {
//do whatever you need to do with the text
}
//[code...]
@end
… и для установки поля делегирования при FirstViewController
создании SecondViewController
:
SecondViewController* sv = [[SecondViewController alloc] init];
sv.somestring = someanotherstring;
sv.delegate = self;
Наконец, в SecondViewController
вы реализуете viewWillDisappear
примерно так:
- (void) viewWillDisappear: (bool)animated {
[super viewWillDisappear:animated];
if (self.delegate) {
[self.delegate viewControllerWillDisappearWithLabelText: myLabel.text];
}
}
Ответ №2:
Да, есть гораздо более простой способ справиться с этим…..
Вы можете использовать глобальную переменную
В вашем файле Delegate.h объявите свою переменную:
@interface Smoke_ApplicationAppDelegate : NSObject {
UIWindow *window;
UINavigationController *navigationController;
NSString *messageString; //This would be your String Variable
}
@property(nonatomic,retain)NSString *messageString;
Во-вторых, в файле Delegate.m
@implementation Smoke_ApplicationAppDelegate
@synthesize window;
@synthesize navigationController;
@synthesize messageString; // Synthesize it over here..
Это сделано.Теперь вы можете использовать эту строковую переменную во всех / любом классе, который вы хотите..
Чтобы использовать эту глобальную переменную.
Просто импортируйте файл делегирования, чтобы сделать из него obj….
import "DelegateFile.h"
@implementation About
DelegateFile *appDel;
Теперь в вашем class.m
-(void)viewDidLoad { [super viewDidLoad];
appDel=[[UIApplication sharedApplication]delegate];
}
Теперь вы можете получить к нему доступ в любом месте вашего класса с помощью этого объекта:
appDel.messageString
Просто внимательно следуйте моим инструкциям, я уверен, что это определенно поможет вам…..
Легкой жизни,
Комментарии:
1. Спасибо, что приняли ответ. Тем не менее, вы можете сделать то же самое и с другими способами, создав объект другого класса и используя его с помощью synthesize.
Ответ №3:
Объявите строку (stringVal) в appdeleage и задайте ее свойство как неатомное и сохраните, также синтезируйте его.Во втором контроллере представления вы можете установить значение метки в строку appdelegate ([appdelegate setStringVal:label.text];) .Вы можете получить это значение в первом контроллере представления и использовать его в таблице (NSString *localString=appdelegate.stringVal];).
Всего наилучшего.