5

xcode 5 で「IOS プロジェクト」を作成すると、iPad シミュレーターの起動時に次のようになります。このアプリケーションは、iPhone の構成に対応しています。ターゲットを 5 以降に設定し、ios/xcode 5 と互換性がないため autolayout を削除しました。

iPad アプリの起動時に次のエラーが表示されます。

2013-08-29 08:53:57.688 IOS Project[350:c07] -[MasterViewController    setPreferredContentSize:]: unrecognized selector sent to instance 0x9e2cc20
2013-08-29 08:53:57.692 IOS Project[350:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MasterViewController setPreferredContentSize:]: unrecognized selector sent to instance 0x9e2cc20'
*** First throw call stack:
(0x1cd012 0x14c4e7e 0x2584bd 0x1bcbbc 0x1bc94e 0xbe7b 0x624d36 0x85054a 0x8506c3 0x40871e 0x4089a2 0x407876 0x418cb5 0x419beb 0x40b698 0x1f5fdf9 0x1f5fad0 0x142bf5 0x142962 0x173bb6 0x172f44 0x172e1b 0x40717a 0x408ffc 0x6d3d 0x6ca5)
4

3 に答える 3

17

問題を特定する上で受け入れられた回答は正しいですが、特定のデバイスのバージョンを確認せず、代わりに次のようなものを使用します

if ( [self respondsToSelector:@selector(setPreferredContentSize:)] ) ...
于 2013-10-13T02:24:00.310 に答える
3

iOS7 ではUIViewController、新しいプロパティがありますpreferredContentSize。iOS7 用に作成されたプロジェクトには、次のメソッドがあります。

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

したがってsetPreferredContentSize:、プロパティが実装されているかどうかに関係なく、独自のコントローラーにメッセージを送信します。この問題を解決するには、存在しないプロパティを設定しないようにすることをお勧めします。

- (void)awakeFromNib
{
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending) {
        self.preferredContentSize = CGSizeMake(320.0, 480.0);
    }
    [super awakeFromNib];
}
于 2013-09-04T03:57:43.550 に答える
2

アプリの下位互換性を維持したい場合は、新しいバージョンの iOS で新しく導入されたメソッドの存在を常に確認してください。メソッドが古いバージョンに存在しない場合は、呼び出してはなりません。respondsToSelector特定のメソッドの存在を知る 方法があります。
したがって、あなたの場合、 をチェックしたい場合はpreferredContentSize、次のようにすることができます:

if ([self respondsToSelector:@selector(preferredContentSize)]) {
    self.preferredContentSize = CGSizeMake(320.0, 600.0);
}
于 2014-03-13T04:53:41.237 に答える