文字を折り返す
複数行に渡って表示する場合は、UILabelのnumberOfLinesプロパティを変更する。無制限の場合はゼロを設定する
textLabel.numberOfLines = 0;
折り返すときのモードも設定できる
textLabel.lineBreakMode = UILineBreakModeCharacterWrap;
複数行に渡って表示する場合は、UILabelのnumberOfLinesプロパティを変更する。無制限の場合はゼロを設定する
textLabel.numberOfLines = 0;
折り返すときのモードも設定できる
textLabel.lineBreakMode = UILineBreakModeCharacterWrap;
データの更新などを行った後、スレッド内で単に
tableView.reloadData()
[(UITableView)tableView reloadData]
とやると落ちてしまう。そこで以下のようなコードを記述することによって、データの再読み込み処理をメインスレッドに戻して処理させるようにする。
dispatch_async(dispatch_get_main_queue(), { () -> Void in self.tableView.reloadData() })
[(UITableView)tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
また、下記のようにUserDefaultのデータをCellにデータを反映させる場合に、
@IBOutlet weak var label: UILabel! override func viewWillAppear(animated: Bool) { let defaults = NSUserDefaults.standardUserDefaults() label.text = defaults.valueForKey("label")! as? String }
viewWillAppear()でreloadData()しただけでは、うまくテーブルが更新されないので、
override func viewWillAppear(animated: Bool) { let defaults = NSUserDefaults.standardUserDefaults() label.text = defaults.valueForKey("label")! as? String tableView.reloadData() }
viewDidAppear()でもreloadData()する必要がある。
override func viewDidAppear(animated: Bool) { tableView.reloadData() }
UITableViewControllerを使用しない場合、View遷移時のセルハイライトの解除を自分で記述する必要がある
tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow, animated: true)
[(UITableView)tableView deselectRowAtIndexPath:[(UITableView)tableView indexPathForSelectedRow] animated:YES];
セルを選択した場合もハイライト表示としない
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell cell.selectionStyle = UITableViewCellSelectionStyle.None return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // セル選択時のスタイルを無表示スタイルに設定する cell.selectionStyle = UITableViewCellSelectionStyleNone; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // セル選択時も非選択状態とする [tableView deselectRowAtIndexPath:indexPath animated:YES]; }
UITableView内全てのセルを選択不可にする
tableView.allowsSelection = false
[(UITableView)tableview setAllowsSelection:NO];
UITableView上部にヘッダビューを追加する
tableView.tableHeaderView = view
(UITableView)tableView.tableHeaderView = (UIView)view;
追加するViewは、ViewcontrollerのサブViewにしない。
文字数に合わせたセルの高さを設定する
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { // セルの取得 UITableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath]; // 最大サイズ CGSize bounds = CGSizeMake(_tableView.frame.size.width, _tableView.frame.size.height); // ラベルサイズ CGSize size = [cell.textLabel.text sizeWithFont: cell.textLabel.font constrainedToSize: bounds lineBreakMode: UILineBreakModeCharacterWrap]; return size.height; }
// とりあえず高さを指定 tableView.estimatedRowHeight = 100 // 高さを自動指定 tableView.rowHeight = UITableViewAutomaticDimension
Storyboard上で設定したPrototypeCellに含まれるUIImageViewやUILabelをコード上から指定する場合、それぞれのViewにラベルを付与しておくことで、ラベル番号を指定してViewを取得することが可能である。
プロトタイプセル上にUIImageViewを作成し、Tag=1を指定している。
上記の例で、UIImageViewにSwift上からアクセスする場合は、
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell let imageView: UIImageView = cell.viewWithTag(1) as! UIImageView return cell }
とすれば良い。