设置视图控制器属性时{iOS}崩溃

时间:2017-12-04 14:44:24

标签: ios objective-c xcode uitableview uiviewcontroller

我在将数据传递给新的视图控制器时遇到了问题。

我有两个VC。在“FirstVC”中,有一个包含动态原型单元格的表格视图。通用单元格包含一个标签和一个按钮,并将其分配给自己的类“GenericCell”。我想按下按钮时将单元格标签的文本传递给SecondVC,但应用程序崩溃时出现错误:

  

Interface Builder文件中的未知类_TtC13testTableView37SecondVC。

     

UIViewController setMyString:]:无法识别的选择器发送到实例0x7fa05e418110

     

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [UIViewController setMyString:]:无法识别的选择器发送到实例0x7fc8add05710

我试过了:

  1. 在getText方法之外使用segue(使用prepareForSegue方法)

    1a上。从getText方法的外部推送VC

  2. 实现和调用myString的set / get方法

  3. 向myString属性添加属性

  4. 但应用程序崩溃了。

    GenericCell.h

    #import <UIKit/UIKit.h>
    @protocol MyCellDelegate
    -(void)getText:(NSString *)text;
    @end
    
    @interface GenericCell: UITableViewCell
    @property (weak, nonatomic) IBOutlet UILabel * label;
    @property (assign, nonatomic) id <MyCellDelegate> delegate;
    @end
    

    GenericCell.m

    #import "GenericCell.h"
    @interface GenericCell()
    @end
    
    @implementation GenericCell
    
    - (IBAction)buttonPressed {
        if (self.delegate) {
            [self.delegate getText:self.label.text];
        }
    }
    @end
    

    FirstVC.m

    #import "FirstVC.h"
    #import "GenericCell.h"
    #import "SecondVC.h"
    
    @interface FirstVC() <UITableViewDataSource,UITableViewDelegate, MyCellDelegate>
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    @property NSString * idToPass;
    @end
    
    @implementation FirstVC
    
    
    NSMutableArray<NSString *> *array;
    
    - (void)viewDidLoad {
    
        array = [[NSMutableArray alloc]initWithObjects:@"0x22", @"0x11", @"0x24", nil];
    
        [super viewDidLoad];
        self.tableView.dataSource=self;
        self.tableView.delegate=self;
        self.tableView.rowHeight=100;
    }
    
    -(void)getText:(NSString *)text {
       self.idToPass = text;
    
       SecondVC * secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondVC"];
       secondVC.myString = self.idToPass;
       [[self navigationController] pushViewController:secondVC animated:YES];
    
    }
    
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return array.count;
    }
    
    - (GenericCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    
        GenericCell * cell = [[self tableView]dequeueReusableCellWithIdentifier:@"GenericCell" forIndexPath:indexPath];
    
        cell.delegate = self;
        cell.label.text = [array objectAtIndex:indexPath.row];
        return cell;
    }
    @end
    

    SecondVC.h

    #import <UIKit/UIKit.h>
    @interface SecondVC : UIViewController
    @property (weak, nonatomic) IBOutlet UILabel *label;
    @property NSString * myString;
    @end
    

    SecondVC.m

    #import "SecondVC.h"
    
    @interface SecondVC ()
    @end
    
    @implementation SecondVC
    
    - (void)viewDidLoad {
        self.label.text = self.myString;
        [super viewDidLoad];
    }
    
    @end
    

    使用委托正确设置“idToPass”。

2 个答案:

答案 0 :(得分:0)

在getText方法中,您将文本分配给myProperty而不是myString ...

应该是:

secondVC.myString = self.idToPass;

答案 1 :(得分:0)

这项工作对我来说:在buttonPressed方法中更新像这样的if语句

if ([self.delegate respondsToSelector:@selector(getText:)]){
        [self.delegate getText:self.label.text];
}

为SecondVC提供数据的另一个选择是使用

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    SecondVC * vc = segue.destinationViewController;
    if ([segue.identifier isEqualToString: @"yourSegue"]) {
        vc.myString = self.idToPass;
    }
}

我建议的一个提示是检查(使用简单的if语句)SecondVC中的对象是否为nil或者!nil

我希望这有帮助:)