ios - 弹出窗口中无法识别的选择器

标签 ios objective-c uiviewcontroller uinavigationcontroller segue

我在我的应用程序中使用这段代码来传递具有相应序列的数据:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"readMoreDetail"]) {
    MoreViewController *destinationViewController = segue.destinationViewController;
    destinationViewController.openSubject = [self.detailItem description];
} else if ([segue.identifier isEqualToString:@"notesSegue"]) {
    NSLog(@"segue");
    NotesTableViewController *destinationViewController = segue.destinationViewController;
         destinationViewController.openSubject = [self.detailItem description];
    } else {
        // Do nothing
    }
}

我已经在 NavigationController 中嵌入了一个 UIViewController 并创建了一个从另一个 UIViewController 到 NavigationController 的弹出窗口转场 - 但是当我导航时我得到了这个错误:

-[UINavigationController setOpenSubject:]: unrecognized selector sent to instance 0x15e532a0

有什么想法吗?

谢谢!

NotesTableViewController.h

#import <UIKit/UIKit.h>

@interface NotesTableViewController : UITableViewController <UINavigationControllerDelegate>

@property(nonatomic, strong)NSString *openSubject;

@end

NotesTableViewController.m

#import "NotesTableViewController.h"

@interface NotesTableViewController ()
{
NSMutableArray *_objects;
}

@end

@implementation NotesTableViewController
@synthesize openSubject;

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

if (openSubject.length == 0) {
    // There's currently no subject open, write it in the navigationbar
    // Prompt = open subject
    // Title = notes header
    self.navigationItem.prompt = @"No subject selected";
    self.navigationItem.title = @"My Notes";
} else {
    // Open the subject

    // Prompt = notes header
    // Title = open subject
    self.navigationItem.prompt = openSubject;
    self.navigationItem.title = @"My notes";

    // Load the notes data
    // Create the key
    NSString *partOfKey = @"-notes";
    NSString *notesKey = [NSString stringWithFormat:@"%@%@", openSubject, partOfKey];

    // Load the _objects from NSUserdefaults
    _objects = [[NSUserDefaults standardUserDefaults] objectForKey:notesKey];
}

// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
self.navigationItem.leftBarButtonItem = self.editButtonItem;

// Register a class or nib file using registerNib:forCellReuseIdentifier
// o registerClass:forCellReuiseIdentifier: method before calling this method
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}

- (void)awakeFromNib
{
self.clearsSelectionOnViewWillAppear = NO;
self.preferredContentSize = CGSizeMake(320.0, 600.0);
[super awakeFromNib];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)addNote:(id)sender {
// Create a new note
if (openSubject.length == 0) {
    // The openSubject is nil, can't add a subject - tell the user
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"No subject" message: @"Please select a subject prior to adding a note" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show];
} else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New note" message:@"Enter a note" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];
    alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    [alert show];
}
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
// The user created a new subject, add it
if (buttonIndex == 1) {
    // Get the input text
    NSString *newNote = [[alertView textFieldAtIndex:0] text];

    // Initialize objects
    if (!_objects) {
        _objects = [[NSMutableArray alloc] init];
    }
    // Check if the note already exist
    if ([_objects containsObject:newNote]) {
        // Tell the user this note already exists
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Already exists" message: @"This note already exist, sorry" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    } else {
        // The note doesn't exist, add it
        [_objects insertObject:newNote atIndex:0];
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

        // Save the new _objects
        [self saveObjects];
    }
}
}

-(void)saveObjects {
// Create the key
NSString *partOfKey = @"-notes";

    // Save the new objects
NSString *notesKey = [NSString stringWithFormat:@"%@%@", openSubject, partOfKey];
[[NSUserDefaults standardUserDefaults] setObject:_objects forKey:notesKey];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return _objects.count;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

NSString *object = _objects[indexPath.row];
cell.textLabel.text = [object description];
return cell;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
    [_objects removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

    // Save the new objects
    [self saveObjects];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}


/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the item to be re-orderable.
return YES;
}
*/

    /*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before     navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/

@end

(相信大家不要盗用这段代码)

最佳答案

如果您触发到 UINavigationController 的 Segue,则 segue.destinationViewController 将是导航 Controller ,而不是导航中包含的 View Controller Controller 。

但是,您可以获取对 NotesTableViewController 的引用:

UINavigationController *navController = segue.destinationViewController;
NotesTableViewController *notesTableVC = (NotesTableViewController *)[navController topViewController];

然后你就可以使用了

notesTableVC.openSubject = [self.detailItem description];

等等。在 NotesTableViewController 中设置属性。

关于ios - 弹出窗口中无法识别的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23766233/

相关文章:

ios - Xcode5.1.1 and Xcode6 beta7 iOS7.1 64-bit [Allocator] 分配器无效,回落到malloc

ios - 无法导出应用程序以进行应用程序商店分发或临时分发?

ios - 在顶部带有标签的 UISearchBar TextField 中重新定位光标

objective-c - 如何更改 Storyboard 上的 NavigationController.title.font?

ios - 在后台线程上创建 UIViewController 可以吗?

ios - 从后台在简历上呈现 ModalViewController,避免下面的内容闪现

iphone - CGContextShowText 绘制居中对齐

ios - 从 UICollectionViewCell 传播自定义事件

Iphone 默认键盘 "Go"按钮操作不适用于 PhoneGap

ios - 在没有 Storyboard的情况下更改 View Controller