如何在 tableview 和 viewcontroller 之间传递字符串

Posted

技术标签:

【中文标题】如何在 tableview 和 viewcontroller 之间传递字符串【英文标题】:How to pass string between tableview and viewcontroller 【发布时间】:2016-09-19 14:05:49 【问题描述】:

首先,在 todolistviewController 中。我有用于填充字符串的文本字段和用于保存字符串的按钮保存以显示在 tableview1 中。这个简单的笔记给我。

接下来,我在文本字段上创建按钮,当点击文本字段时将显示 tableview2 用于选择 menu1(String)、menu2(String)、menu3(String)。

当菜单被选中时将返回 todolistviewController 并显示在文本字段中选择的菜单。我需要知道如何传递菜单(字符串)以显示在文本字段中。

【问题讨论】:

【参考方案1】:

通常有两种方法可以实现您的目标,即将一个 NSString 从 TabelView2Controller 传回 TodoListViewController。

首先,您需要在TabelView2Controller @property (nonatomic, strong) NSString *selectedMune 中声明一个NSString 属性,并在UITableViewDelegate 方法tableView:didSelectRowAtIndexPath: 中将其更新为您选择的菜单(字符串)

那么你可以选择以下两种模式之一

    委托模式

在您的 TabelView2Controller 的头文件中定义一个协议。在该协议中,定义一个用于在 tableView2Controller 中通知选择更新的方法。

//TableView2Controller.h
@protocol TableView2ControllerDelegate <NSObject>
@required
- (void)updateSelectedMenu:(NSString *)selectedMenu;

@interface TableView2Controller: UITableViewController
@property (nonatomic, strong) NSString *selectedMune;
@property (weak, nonatomic) id<tableView2ControllerDelegate> delegate;
@end

让你的 TodoListViewController 符合这个协议。

您应该将 TodoListViewController 设置为 TableView2Controller 的委托。如果您使用 Storyboard,您应该在 TodoListViewController 的方法performSegueWithIdentifier:sender: 中进行设置。

然后在TableView2Controller的UITableViewDelegate方法tableView:didSelectRowAtIndexPath:你可以调用updateSelectedMenu:通知delegate你的选择改变了。而在TodoListViewController的updateSelectedMenu:方法中,你可以根据输入的参数更新你的UI。

    通知模式

在你的 TableView2Controller 中定义一个 NSNotification。将选中的菜单字符串存储在通知的userInfo中,并将此通知发布到TableView2Controller的UITableViewDelegate方法tableView:didSelectRowAtIndexPath:

//TableView2Controller.h
extern NSString *const TableView2ControllerSelectedMenuDidChangedNotification;
extern NSString *const TableView2ControllerSelectedMenuKey;

@interface TableView2Controller: UITableViewController
@property (nonatomic, strong) NSString *selectedMune;
@end

//TableView2Controller.m
NSString *const TableView2ControllerSelectedMenuDidChangedNotification = @"TableView2ControllerSelectedMenuDidChangedNotification";
NSString *const TableView2ControllerSelectedMenuKey = @"TableView2ControllerSelectedMenuKey";

@implementation TableView2Controller
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

NSDictionary *userInfo = @TableView2ControllerSelectedMenuKey: self.selectedMune;
[[NSNotificationCenter defaultCenter] postNotificationName:TableView2ControllerSelectedMenuDidChangedNotification
                                                    object:self
                                                  userInfo:userInfo];

@end

在 TodoListViewController 中注册 TableView2ControllerSelectedMenuDidChangedNotification

// TodoListViewController.m
- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(selectedMenuUpdateNotification:) 
                                                 name:TableView2ControllerSelectedMenuDidChangedNotification
                                              object:nil]; 


- (void)viewDidDisappear:(BOOL)animated 
    [super viewDidDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];

然后在 TodoListViewController 的selectedMenuUpdateNotification: 方法中,您可以使用 userInfo 中的 TableView2ControllerSelectedMenuKey 获取更新 selectedMenu 并相应地更新您的 UI。

【讨论】:

以上是关于如何在 tableview 和 viewcontroller 之间传递字符串的主要内容,如果未能解决你的问题,请参考以下文章

快速显示视图控制器

推送视图控制器时延迟(iOS)

弹出视图控制器导致条形按钮项消失

如何保持 Tableview 滚动以及如何在 Swift3 中删除原型单元和 tableview 之间的空白空间

如何在 JavaFx TableView 中添加 TableView 页脚

如何在 tableview 和 viewcontroller 之间传递字符串