こんにちは、iPadアプリでmaster controller
にはリストがあり、details controllerには詳細があり、典型的なUISplitViewController
パターンです。私が達成したいのは、最初の行を最初に選択し、後でユーザーに選択の選択肢を与えることです。セルのsetSelected
を使用しており、didSelectRowAtIndexPath
メソッドでこのような選択を削除しています。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:NO];
NSIndexPath* path = [NSIndexPath indexPathForRow:0 inSection:0];
UITableViewCell* cell = [tableView cellForRowAtIndexPath:path];
[cell setSelected:NO];
}
最初のセルですが、その後、私のnoneセルが選択されています。手伝ってください。
これを試して
NSIndexPath* selectedCellIndexPath= [NSIndexPath indexPathForRow:0 inSection:0];
[self tableView:tableViewList didSelectRowAtIndexPath:selectedCellIndexPath];
[tableViewList selectRowAtIndexPath:selectedCellIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
OR
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (/* should be selected */) {
[cell setSelected:YES animated:NO];
}
}
Swift 4バージョンは
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
func shouldSelect() -> Bool {
// Some checks
}
if shouldSelect() {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
}
}
セルを選択して表示するには、-setSelected:animated:
内から-tableView:willDisplayCell:forRowAtIndexPath:
を呼び出す必要があります。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (/* should be selected */) {
[cell setSelected:YES animated:NO];
}
}
他の場所から-setSelected
を呼び出しても効果はありません。
Swift 4:最初にセルを選択する
import UIKit
class MyViewController: UIViewController, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
...
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if /* your code here */ == indexPath.row {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableView.ScrollPosition.none)
}
}
...
}
あなたがこの答えを期待しているのかわかりません。デフォルトでは、手動で選択せずにtableViewの最初の行を選択する場合は、次のようにdidSelectRowAtIndexPath
メソッドを開始するだけです。
- (void)viewDidAppear:(BOOL)animated {
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:0];
[myTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionBottom];
}
POPナビゲーションの場合にも役立ちます
.hファイル、
NSIndexPath *defaultSelectedCell
.mファイル
このコードをViewDidLoad
に入れます
defaultSelectedCell= [NSIndexPath indexPathForRow:0 inSection:0];
viewDidAppear
[self.tableView selectRowAtIndexPath:defaultSelectedCell animated:NO scrollPosition:UITableViewScrollPositionNone];
これは、POPするときに役立ちます。このコードをviewWillAppear
に入れます
[self.catTableView selectRowAtIndexPath:defaultSelectedCell animated:NO scrollPosition:UITableViewScrollPositionNone];
tableView didSelectRowAtIndexPath
方法、
defaultSelectedCell = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
これは、初回の読み込みまたはポップナビゲーションのいずれかを完全に支援します。
Swift 4および5:willDisplayCell
の状態をリセットせずに、最初に一度だけセルを選択します。
override func viewWillAppear(_ animated: Bool) {
for section in 0..<tableView.numberOfSections {
for row in 0..<tableView.numberOfRows(inSection: section) {
let indexPath = IndexPath(row: row, section: section)
if /* your condition for selecting here */ {
_ = tableView.delegate?.tableView?(tableView, willSelectRowAt: indexPath) // remove if you don't want to inform the delegate
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
tableView.delegate?.tableView?(tableView, didSelectRowAt: indexPath) // remove if you don't want to inform the delegate
}
}
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if shouldSelectThisRow {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
} else {
tableView.deselectRow(at: indexPath, animated: false)
}
}
Swift 5、@ Ravindhiranの回答に感謝します。
let selectedCellIndexPath = IndexPath(row: 0, section: 0)
tableView(tableViewList, didSelectRowAt: selectedCellIndexPath)
tableViewList.selectRow(at: selectedCellIndexPath, animated: false, scrollPosition: .none)
または
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if /* should be selected */{
cell.setSelected(true, animated: false)
}
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// reset cell state
cell.accessoryType = .none // (if you needed)
tableView.deselectRow(at: indexPath, animated: false)
// if need select
cell.accessoryType = .checkmark // (if you needed)
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
}
// method work fine when tap cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath)
use [cell setSelected:YES animated:NO];セルタップdidSelectRowAt、didDeselectRowAtが機能しない