【问题标题】:how to set value to textField through a delegate如何通过委托为 textField 设置值
【发布时间】:2017-08-17 11:16:32
【问题描述】:

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

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

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

为了完成这个任务,我在 TableViewController 中创建了一个协议,其中包含一个名为 valueChoosen: (NSString *) value 的必需方法,该方法在 ViewController 中实现,然后我将值设置为 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

视图控制器

 #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

【问题讨论】:

  • 在执行展开转场之前调用委托方法
  • @StasVolskiy 我试过了,但文本字段仍然是空的
  • 日志中列出了什么?委托方法调用了吗?
  • 在头文件中添加代理

标签: ios objective-c delegates


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    第 1 步:

    在您想要展开的视图控制器中创建展开操作。在您的情况下,它是 ViewController

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

    第 2 步: 连接到放松动作

    • 控制从 tableviewcell 拖动到退出标志。
    • 选择您指定的操作。
    • 添加标识符以展开 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];}
       }
    }
    

    【讨论】:

    • 但是当我从 tableviewcontroller 拖到退出图标时什么都没有出现,我可以将您在 yourasnwer 中提到的第一种方法链接到 tableviewcontroller 中的退出按钮?任何其他建议
    • @user2121 从 tableviewCell 拖动到退出图标。
    • 是的..就像我做的那样,但退出图标从未突出显示没有任何菜单,所以我可以选择方法
    • 有没有在ViewController中写方法-(IBAction)unwindFromModalController:(UIStoryboardSegue *)segue{}
    • 是的,我确实在 ViewController 中编写了以下方法 - (IBAction)unwindFromTableViewController:(UIStoryboardSegue *)segue{ NSLog(@"unwindFromModalController"); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2011-05-19
    相关资源
    最近更新 更多