0

マスターと詳細の両方で NavigationController を使用して SplitViewController を実装しようとしています。私はこのチュートリアルに従っていますが、まだかなり奇妙な問題に遭遇しています。デリゲートメソッドを呼び出そうとすると、-[UINavigationController selectedStudent:]: unrecognized selector sent to instance...

どんな助けでも大いに感謝します。

コードは次のとおりです。

StudentSelectionDelegate.h

#import <Foundation/Foundation.h>
@class Student;
@protocol StudentSelectionDelegate <NSObject>
@required
-(void)selectedStudent:(Student *)newStudent;
@end

StudentDetail は、分割ビューの詳細を表します。StudentDetail.h で私は持っています

#import "StudentSelectionDelegate.h"
@interface StudentDetail : UITableViewController <StudentSelectionDelegate>
...

StudentDetail.m

@synthesize SentStudent;
...
-(void)selectedStudent:(Student *)newStudent
{
    [self setStudent:newStudent];
}

StudentList は分割ビューのマスターを表します。StudentList.h には次のものがあります。

#import "StudentSelectionDelegate.h"
...
@property (nonatomic,strong) id<StudentSelectionDelegate> delegate;

StudentList.m のdidSelectRowAtIndexPath

[self.delegate selectedStudent:SelectedStudent];

そして、「SelectedStudent」はnullではありません

そして最後に AppDelegate.m

#import "AppDelegate.h"
#import "StudentDetail.h"
#import "StudentListNew.h"
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *leftNavController = [splitViewController.viewControllers objectAtIndex:0];
    StudentListNew  *leftViewController = (StudentListNew *)[leftNavController topViewController];
    StudentDetail  *rightViewController = [splitViewController.viewControllers objectAtIndex:1];

    leftViewController.delegate = rightViewController;

    return YES;
}

PS私は何時間も解決策を探していました。

4

1 に答える 1

1

[splitViewController.viewControllers objectAtIndex:1]ではUINavigationControllerなく、StudentDetailです。

エラー メッセージはUINavigationController、プロパティがないことを示していselectedStudentます。

あなたのデリゲートは を指しているのStudentDetailではなく、 を実装していないナビゲーション コントローラーを指しています< StudentSelectionDelegate>。ただし、キャストを指定したため、Objective C は、キャストしたオブジェクトが実際にはキャストしたクラスの種類ではないことを警告できません。

オブジェクトが期待どおりのクラスであることを確認するために、Apple のコードと同様に、オブジェクトの型チェックを検討する必要があります。

修正されたコードは次のとおりです。

UINavigationController *rightNavController = [splitViewController.viewControllers objectAtIndex:1];
StudentDetail  *rightViewController = (StudentDetail *)[rightNavController topViewController];
leftViewController.delegate = rightViewController;

デリゲートがメソッドを実装していることを確認することに関しては、

if ([self.delegate respondsToSelector:@selector(selectedStudent:)]) {
    [self.delegate selectedStudent:SelectedStudent];
}

self.delegate がStudentDetail.

于 2016-01-07T13:51:39.657 に答える