Передача параметра из вида обратно в ячейку UITableView другого вида

#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];).

Всего наилучшего.