1

セグエを終了した後、テーブルビューの値をリロードしようとしています。プロセスは次のとおりです。プロファイル選択ビューから手動でシーケンスを実行し、新しいプロファイル名を追加して、プロファイル選択ビューに戻ります。次に、新しいプロファイル名を追加してテーブルビューをリロードしたいと思います。コードは正常に実行されていますが(シーンへの元のエントリと同じコード)、numberOfRowsInSectionおよびnumberOfRowsInSectionのネイティブメソッドを取得してテーブルビューを再作成できないようです。新しいプロファイル名が更新される前に、実際に画面を離れて再入力する必要があります。何かご意見は?


//**手動でシーケンスを実行する

-(IBAction)buttonAddNewProfile:(id)sender
{
    // creating object for profile selection screen
    UIStoryboard *ProfileSelectionStoryboard=[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

    // creating object for add new profile storyboard
    AddNewProfileViewController *addnewprofileVC=[ProfileSelectionStoryboard instantiateViewControllerWithIdentifier:@"Add New Profile"];

    // setting the transition style
    addnewprofileVC.modalTransitionStyle=UIModalTransitionStylePartialCurl;

    // performing the segue
    [self presentViewController:addnewprofileVC animated:YES completion:nil];

    // performing new table view load on return from new profile
    [self loadUsers];
}

//**で新しいプロファイル名をロードする関数。

-(void)loadUsers
{
    // retreiving the users from the database
    SQLiteFunctions *sql = [[SQLiteFunctions alloc] init];

    // testing for successful open
    if([sql openDatabase:@"users"])
    {
        // setting query statement
        const char *query = "SELECT * FROM  users;";

        // testing for that profile name existing already
        if([sql getUserRecords:query] > 0)
        {
            // initializing array
            NSMutableArray *names = [[NSMutableArray alloc] init];

            // loop through object compling an array of user names
            for(Users *ProfileUser in sql.returnData)
            {
                // adding user name to the listview array
                [names addObject:ProfileUser.user_name];
            }

            // setting table view array to local array
            tableData = names;
        }
    }
}

//**テーブルビューをリロードするメソッド

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
    // returning the number of rows in the table
    return [tableData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    // setting up the table view cells for data population
    UITableViewCell *cell = nil;
    cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

    // testing for cell parameters
    if (cell == nil)
    {
        // setting up cloned cell parameters
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"];
    }

    // setting cell values to the array row value
    cell.textLabel.text = [tableData objectAtIndex:indexPath.row];

    // returning the current row label value
    return cell;
}
4

2 に答える 2

3

ここにはいくつかの異なるオプションがあります。

1)最も簡単なのは、ViewControllerがビューを表示しようとするたびにテーブルをリロードすることです。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView reloadData];
}

ただし、欠点は、必ずしもデータをリロードする必要がない場合でも、ビューが表示されるたびに実行されることです。

2)ストーリーボードを使用していてiOS 6以降をターゲットにしている場合は、プロファイルの追加ビューコントローラーから戻るときに、アンワインドセグエを使用してビューコントローラーの特定のメソッドを呼び出すことができます。詳細については、このSOの質問/回答を参照してください。Xcode4.5を使用してストーリーボードを編集するときに、新しい終了アイコンが何に使用されるかを知っている人はいますか?

3)古いバージョンのiOSをターゲットにしている場合、またはストーリーボードを使用していない場合は、新しいプロファイルが追加されるたびに呼び出されるメソッドを使用してプロトコルを作成し、そのメソッドが呼び出されるたびにデータを再ロードできます。SOには、これを行う方法をカバーする多くの質問があります(dismissModalViewControllerと、データを渡す方法を示すデータを返すなどですが、メソッドを呼び出すだけでも同じことができます)。

于 2012-12-28T18:52:41.117 に答える
0

これは、上記のコメントのlnafzingerからの実際の回答です。再度、感謝します。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView reloadData];
}

これを理解するのに少し時間がかかりましたが、これはUIModalTransitionStylePartialCurlmodalTransitionStyleを使用しているためです。完全に画面から出てこないので、呼ばないのではないでしょうか。別のスタイル(デフォルトなど)を使用すると、viewWillAppearが呼び出されます。それを維持したい場合は、おそらく他の方法のいずれかを使用する必要があります。–lnafziger

于 2012-12-29T02:56:24.410 に答える