如何通过委托将值设置为textField

时间:2017-08-17 11:16:33

标签: ios objective-c delegates

我有两个视图控制器,视图控制器和tableViewController。 ViewController包含一个textField和一个按钮。当单击viewController中的按钮时,TableViewController应该启动。

在TableViewController中,有一个包含5行的列表,每行包含一个字符串值。

我想要做的是,当用户选择TableViewController列表中的任何行时,ViewController场景应该开始,用户选择的值应该显示在ViewController的文本字段中。

为了完成这个任务,我在TableViewController中使用一个名为valueChoosen: (NSString *) value的必需方法创建了一个协议,这个方法在ViewController中实现,然后我将值设置为textField,但是在运行时TextField是空。

请看下面的代码,让我知道为什么传递给协议所需方法的值不能设置为textfield,我做错了什么;

TableViewController

#import "TableViewController.h"

@interface TableViewController ()

@property NSArray *tableData;

@end

@implementation TableViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.

self.tableData = [NSArray arrayWithObjects:@"Android",
                  @"iOS",
                  @"swift",
                  @"objective-c",
                  @"openCV",nil];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}


-(NSInteger) tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section {

return [self.tableData count];
}

-(UITableViewCell *) tableView:(UITableView *)tableView   
cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"SimpleTableItem";

UITableViewCell *cell = [tableView    
dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc]   
initWithStyle:UITableViewCellStyleDefault   
reuseIdentifier:simpleTableIdentifier];
}

cell.textLabel.text = [self.tableData objectAtIndex:indexPath.row];
cell.imageView.image = [UIImage imageNamed:@"images.jpg"];

return cell;
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:   
(NSIndexPath *)indexPath {

NSLog(@"%@", [self.tableData objectAtIndex:indexPath.row]);

[self performSegueWithIdentifier:@"unwindSegue" sender:NULL];

[self.delegate valueChoosen:[self.tableData   
objectAtIndex:indexPath.row]];
}

@end

的ViewController

 #import "ViewController.h"
 #import "TableViewController.h"

 @interface ViewController ()

 @property (strong, nonatomic) IBOutlet UITextField   
*textFieldDepartment;

 @property (strong, nonatomic) IBOutlet UIButton    
*buttonSelectFromTableView;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a   
nib.
}


 - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}


 -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
 {

 if ([segue.identifier isEqualToString:@"segueToTableView"]) {
    //code

    TableViewController *table = segue.destinationViewController;
    table.delegate = self;
 }

 }

 -(void) valueChoosen: (NSString *) value {
[_textFieldDepartment setText:value];

 NSLog(@"value: %@", value);
}

@end

2 个答案:

答案 0 :(得分:0)

这可能是因为您在textfield中设置了未显示的viewController文本。尝试使用delegate函数将值分配给变量,并在执行展开delegate之前调用segue函数。并在viewController尝试将文本字段文本设置为通过viewWillAppear方法的委托方法设置其值的变量。

答案 1 :(得分:0)

第1步:

在你想要展开它的viewcontroller中创建展开动作。在你的情况下它是ViewController

- (IBAction)unwindFromModalController:(UIStoryboardSegue *)segue{}

enter image description here 第2步: enter image description here enter image description here 连接到展开动作

  • 控制从tableviewcell拖动到退出标志。
  • 选择您指定的操作。
  • 添加标识符以展开segue。

第3步

触发segue

TableViewController.m中的

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
self.selectedText = self.tableData[indexPath.row];
[self performSegueWithIdentifier:@"unwindSegue" sender:self];}

第4步:

传递数据

放松动作

- (IBAction)unwindFromModalController:(UIStoryboardSegue *)segue{
if ([segue.sourceViewController isKindOfClass:[TableViewController class]]) {
    TableViewController *vc = segue.sourceViewController;
    if (vc.selectedText) {
        [_textFieldDepartment setText:vc.selectedText];}
   }
}