UITableViewController のサブクラスである SlidingVC ヘッダーのプロパティ宣言は次のとおりです。
@property (strong, nonatomic) NSString *user;
これが私の合成行です:
@synthesize user = _user,sortedWordlist = _sortedWordlist, wordlist = _wordlist;
これが私のカスタムinitです:
- (id)initWithUser:(NSString*)theUser
{
self = [super init];
if (self) {
if ([theUser isEqualToString:@"user"]) {
_user = @"user";
}
else if ([theUser isEqualToString:@"opponent"]){
_user = @"opponent";
}
}
return self;
}
何が起こっているかというと、 pver をステップ実行すると、変数デバッガー ウィンドウでのメモリ アドレスが取得されることがinitWithUser:
わかります。私はステップオーバーしてからメソッドを閉じますが、まだ設定されています。ただし、Xcode はもう一度戻ってきて、ステップ オーバーすると、隣にメモリ アドレスがなくなり、後続のメソッドのために残ります。_user
theUser
return self
}
return self
_user
null
2回返されて、2回目にnullに設定されるのはなぜですか?
SlidingVC をインスタンス化する MainVC のメソッドは次のとおりです。
- (WSWordlistTableViewController *)setupWordlistTableViewController:(NSString*)user
{
WSWordlistTableViewController *wordlistTableViewController;
UIView *wordlistContainerView;
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
if ([user isEqualToString:@"user"]){
if(!self.userWordlistTableViewController){
self.userWordlistTableViewController = [[WSWordlistTableViewController alloc] initWithUser:@"user"];
wordlistTableViewController = self.userWordlistTableViewController;
wordlistContainerView = self.userWordlistContainerView;
}
}
else if ([user isEqualToString:@"opponent"]) {
if(!self.opponentWordlistTableViewController){
self.opponentWordlistTableViewController = [[WSWordlistTableViewController alloc] initWithUser:@"opponent"];
wordlistTableViewController = self.opponentWordlistTableViewController;
wordlistContainerView = self.opponentWordlistContainerView;
}
}
wordlistTableViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"wordlistTableViewController"];
wordlistTableViewController.view.frame = wordlistContainerView.bounds;
wordlistTableViewController.view.autoresizingMask = wordlistContainerView.autoresizingMask;
[self addChildViewController:wordlistTableViewController];
[wordlistContainerView addSubview:wordlistTableViewController.view];
[wordlistContainerView bringSubviewToFront:wordlistTableViewController.wordlistTableView];
[wordlistTableViewController didMoveToParentViewController:self];
return wordlistTableViewController;
}
そして、どのボタンが押されたかに応じて、それを呼び出すメソッド:
- (IBAction)slideUserWordlistView:(id)sender {
if(!self.userWordlistTableViewController){
[self setupWordlistTableViewController:@"user"];
}
// (sliding drawer code here)
}
または:
- (IBAction)slideOpponentWordlistView:(id)sender {
if(!self.opponentWordlistTableViewController){
[self setupWordlistTableViewController:@"opponent"];
}
// (sliding drawer code here)
}
私がやっていることは、SlidingVC を含むビューをスライドさせることです。2 人のユーザーごとに 1 つずつ、合計 2 つ持っています。それぞれのボタンが押されると、それぞれの SlidingVC が存在するかどうかを確認し、存在しない場合はインスタンス化してから、slingViewContainer に追加します。