3

そもそも、何が起こっているのかを理解したいので、私はこの質問をしているだけだと言いたい.

Xcode5の新規インストールで古いXcodeプロジェクト(非常に単純なもの)を開きました。iOS 7 で動作しないことに気付いたとき。なぜですか? わからない..

他の質問をいくつか見ましたが、有用な回答が得られなかったので、簡単なテストを作成しました。UITableViewControllerを除いてすべて正常に動作しますdidSelectRowAtIndexPath

見てみな

RootViewController.h:

@interface RootViewController : UITableViewController

@property (strong, nonatomic) NSMutableArray *items;
@end

RootViewController.m viewDidLoad では、配列を初期化します (いくつかの文字列を使用)。

dataSource と delegate メソッドを実装します (はい、デリゲートと dataSource を tableView に設定します)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_items count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...
    cell.textLabel.text = [_items objectAtIndex:indexPath.row];

    return cell;
}

問題はここにあります:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
    // Create the next view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:NO];

    detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}

DetailViewControllerシンプルなUIViewControllerです:

(はい、nib ファイルに IBOutlet を設定しました)

@interface DetailViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *detailLabel;

@end

問題は、これが iOS7 ではDetailViewController機能せず、ラベルが更新されないことです。の前後にラベルテキストを設定しようとしていますpushViewController

これは、以前のすべてのバージョンの iOS で機能します。

iOS 7 で動作しないのはなぜですか??

この他の質問で見たように、これを機能させる唯一の方法は次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
    // Create the next view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];

    dispatch_async(dispatch_get_main_queue(), ^{
        detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
    });
}

誰かがここで何が起こっているのかを理解するのを手伝ってもらえますか??

ありがとう!

_

編集

次のようにも機能します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here, for example:
    // Create the next view controller.
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

    // Push the view controller.
    [self.navigationController pushViewController:detailViewController animated:YES];

    if (detailViewController.view) {
        // do notihing
    }
    detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}
4

2 に答える 2

0

@property (weak, nonatomic) IBOutlet UILabel *detailLabel; を作成しているため、更新されていません。UILabel を弱いプロパティとして作成しています。あなたはそれを強力な財産にしなければなりません。@property (強力、非アトミック) IBOutlet UILabel *detailLabel; あなたがあなたの財産を弱くしているので、それは破壊されています。

弱いプロパティと強いプロパティの詳細について は、Objective-C での強いプロパティと弱いプロパティの違いを参照してください。

于 2015-09-21T11:03:13.857 に答える