【问题标题】:Pass data by UIButton to UITableView on another controller通过 UIButton 将数据传递给另一个控制器上的 UITableView
【发布时间】:2013-12-14 19:43:24
【问题描述】:

我有一个带有 2 个按钮的 AAAViewController 和带有要显示一些 plist 内容的单元格的 BBBTableViewController(我使用故事板)。当按下按钮 btnAAA 时,我想显示 aaa.plist 内容,当按下 btnBBB 时,应该在表格视图中显示 bbb.plist。 我的想法是将 IBActions 分配给按钮,将结果存储到 NSUserDefaults 并在下一个视图控制器的 ViewDidLoad 中收集它:

-(IBAction)pressedAAA {
whatPressed = 1;

//saving my data
NSString *saveWhatPressed = @"AAA";
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:saveWhatPressed forKey:@"savedWhatPressed"];
[defaults synchronize];
}

-(IBAction)pressedBBB {
whatPressed = 2;

//saving my data
NSString *saveWhatPressed = @"BBB";
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:saveWhatPressed forKey:@"savedWhatPressed"];
[defaults synchronize];
}

whatPressed 在另一个控制器中的集合:

- (void)viewDidLoad
{
//import data from AAA view
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
loadWhatPressed = [defaults objectForKey:@"savedWhatPressed"];

NSLog(@"WhatPressed2: %@", loadWhatPressed);

if (loadwhatPressed == 1) {
    NSString *libraryFile = [[NSBundle mainBundle] pathForResource:@"AAA" ofType:@"plist"];
} else {
    NSString *libraryFile = [[NSBundle mainBundle] pathForResource:@"BBB" ofType:@"plist"];
}
[super viewDidLoad];
}

但它失败了 - NSLog 中显示的参数总是显示 whatPressed 的先前值。

下一次,我在 IBAction 中为每个按钮设置了 whatPressed 的值,但我没有 这次使用 NSuserDefaults。然后我尝试了segue,但没有任何成功。

如何正确操作?

一般:

我需要在我的 BBBViewController 中的 ViewDidLoad 中知道在 AAAViewController 中按下了哪个按钮。如果我知道的话,我会使用 if-else 函数来设置一个合适的 .plist。

这是个好主意吗?或者也许有更好的方法?

【问题讨论】:

    标签: ios iphone uitableview uibutton plist


    【解决方案1】:

    您不需要使用 NSUserDefaults 在视图控制器之间传递数据。您可以在 AAAViewController 的 prepareForSegue 方法中设置 BBBViewController 中的字符串

    AAAViewController.m:

    @implementation AAAViewController {
        NSString *libraryFile;
    }
    
    -(IBAction)pressedAAA {
        libraryFile = [[NSBundle mainBundle] pathForResource:@"AAA" ofType:@"plist"];
    }
    
    -(IBAction)pressedBBB {
        libraryFile = [[NSBundle mainBundle] pathForResource:@"BBB" ofType:@"plist"];        
    }
    
    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        BBBViewController* vc = (BBBViewController *)segue.destinationViewController;
        vc.libraryFile = libraryFile;
    }
    

    BBBViewController.h:

    @property (strong, nonatomic) NSString *libraryFile;
    

    编辑: prepareForSegue 将在您的 IBAction 方法之前调用。为了解决这个问题,在界面生成器中给每个按钮一个唯一的标签,并确定在 prepareForSegue 方法中按下了哪个按钮:

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
        UIButton *tappedButton = (UIButton *)sender;
        NSString *libraryFile;
    
        switch (tappedButton.tag) {
            case 0:
                libraryFile = [[NSBundle mainBundle] pathForResource:@"AAA" ofType:@"plist"];
                break;
    
            case 1:
                libraryFile = [[NSBundle mainBundle] pathForResource:@"BBB" ofType:@"plist"];
                break;
    
            case 2:
                libraryFile = [[NSBundle mainBundle] pathForResource:@"CCC" ofType:@"plist"];
                break;
    
            default:
                break;
        }
    
        BBBViewController* vc = (BBBViewController *)segue.destinationViewController;
        vc.libraryFile = libraryFile;
    }
    

    【讨论】:

    • 感谢您的快速回复。我添加了您的代码,但有一个问题。在 BBBViewControler 的 ViewDidLoad 中收集我添加的库文件: myGroup = [[NSDictionary alloc] initWithContentsOfFile:libraryFile];我收到一个错误:“使用未声明的标识符 libraryFile…”我应该将其更改为 _libraryFile 吗?
    • 没问题!至于错误,您有三个选择:1)将其更改为 _libraryFile 2)将其更改为 self.libraryFile 3)在 BBBViewController.m 的实现下,您可以使用“@synthesize libraryFile;”合成变量并且您将能够以与当前相同的方式在代码中引用它
    • 是的,我合成了。现在,通常它可以工作,但我仍然无法显示上一个选择的列表(从之前按下 1 次的按钮)。如果我第一次按下按钮 - 列表是空的。
    • 尝试将用于显示 BBBViewController.m 中列表的代码从 viewDidLoad 移动到 viewWillAppear。 viewDidLoad 仅在创建视图控制器时调用一次,但 viewWillAppear 会在视图控制器即将向用户显示时调用
    • prepareForSegue 总是在 IBAction 方法之前被调用。为了解决这个问题,我首先从按钮中删除了 IBAction 方法,并在界面构建器中为每个按钮提供了一个唯一的标签。然后,我将所有逻辑移至 prepareForSegue 方法。我们知道在该方法中单击了哪个按钮,因为我们得到了发送者。代码可以在这里下载:dropbox.com/s/krsewye24l1ru9q/_test3%20copy.zip
    猜你喜欢
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多