Development Tip

iOS 6 UITableView dequeueReusableCellWithIdentifier : forIndexPath를 사용할 때 UITableViewCell의 스타일 설정 :

yourdevel 2020. 10. 4. 13:33
반응형

iOS 6 UITableView dequeueReusableCellWithIdentifier : forIndexPath를 사용할 때 UITableViewCell의 스타일 설정 :


UITableViewCellStyle.NET 용 iOS 6에서 새로운 방법을 사용할 때을 설정하는 방법을 알아 보려고합니다 UITableView.

이전에는 호출 할 때 다른 유형의 기본 셀을 생성 UITableViewCell하도록 UITableViewCellStyle열거 형을 변경 initWithStyle:했지만 수집 할 수있는 항목에서는 더 이상 그렇지 않습니다.

UITableView상태에 대한 Apple 문서 :

반환 값 : 연관된 재사용 식별자가있는 UITableViewCell 객체. 이 메서드는 항상 유효한 셀을 반환합니다.

토론 : 성능상의 이유로 테이블 뷰의 데이터 소스는 일반적으로 tableView : cellForRowAtIndexPath : 메서드의 행에 셀을 할당 할 때 UITableViewCell 객체를 재사용해야합니다. 테이블보기는 데이터 소스가 재사용을 위해 표시 한 UITableViewCell 오브젝트의 큐 또는 목록을 유지합니다. 테이블보기에 대한 새 셀을 제공하라는 요청을 받으면 데이터 소스 개체에서이 메서드를 호출합니다. 이 메서드는 사용 가능한 경우 기존 셀을 대기열에서 빼거나 ​​이전에 등록한 클래스 또는 nib 파일을 기반으로 새 셀을 만듭니다.

중요 :이 메서드를 호출하기 전에 registerNib : forCellReuseIdentifier : 또는 registerClass : forCellReuseIdentifier : 메서드를 사용하여 클래스 또는 nib 파일을 등록해야합니다.

지정된 식별자에 대한 클래스를 등록하고 새 셀을 만들어야하는 경우이 메서드는 initWithStyle : reuseIdentifier : 메서드를 호출하여 셀을 초기화합니다. 펜촉 기반 셀의 경우이 메서드는 제공된 펜촉 파일에서 셀 개체를로드합니다. 기존 셀을 재사용 할 수있는 경우이 메서드는 대신 셀의 prepareForReuse 메서드를 호출합니다.

이것이 cellForRowAtIndexPath새로운 방법을 구현 한 후 내 새로운 모습입니다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell_identifier";

    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    return cell;
}

지금까지 가지고있는 코드는 잘 작동하지만 항상 기본 스타일을 반환합니다. 어떻게 내가 같은 다른 스타일로 세포를 만들 수 있도록 변경할 수 있습니다 UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2UITableViewCellStyleSubtitle?

하위 클래스를 만들고 싶지 않고 UITableViewCelliOS 6 이전에 할 수 있었던 것처럼 기본 유형을 변경하고 싶습니다. Apple이 향상된 메서드를 제공하지만 구현을 지원하기 위해 최소한의 문서 만 제공하는 것이 이상합니다.

누구든지 이것을 마스터했거나 비슷한 문제에 빠졌습니까? 합리적인 정보를 찾기 위해 고군분투하고 있습니다.


나는 당신이 하위 클래스를 만들고 싶지 않다고 말한 것을 알고 있지만 불가피 해 보입니다. iOS 6.0 시뮬레이터에서 테스트하는 동안 어셈블리 코드를 기반으로 다음을 수행하여 UITableView새 인스턴스 UITableViewCell(또는 하위 클래스)를 만듭니다.

[[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>]

즉, 전송 된 스타일 ( UITableViewCellStyleDefault)이 하드 코딩 된 것처럼 보입니다. 이 문제를 해결하려면 기본 이니셜 라이저를 재정의하고 initWithStyle:reuseIdentifier:사용하려는 스타일을 전달 하는 하위 클래스를 만들어야합니다 .

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    // ignore the style argument, use our own to override
    self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier];
    if (self) {
        // If you need any further customization
    }
    return self;
}

Also, it might be better to send registerClass:forCellReuseIdentifier: in viewDidLoad, instead of doing it every time a cell is requested:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerClass:<RegisteredClass> forCellReuseIdentifier:<ReuseIdentifier>];
}

dequeueReusableCellWithIdentifier isn't deprecated so you aren't required to use the new dequeueReusableCellWithIdentifier:forIndexPath:.

Use the new way along with the appropriate register method (in viewDidLoad) if you are using a custom cell class but use the old way if you want to use one of the UITableViewCellStyle enums.


You can avoid an extraneous subclass by using the storyboard interface builder:

  1. In the Storyboard view, select the table view cell prototype cell (on the table view)
  2. In the Utilities view, in the Attributes inspector, modify the Style value
  3. (Optionally) Modify other values such as Selection and Accessory

The new iOS 6.0 dequeueReusableCellWithIdentifier:forIndexPath: does use those values when allocating new cells and returning them. (Tested on an iOS 6.0 compilation using Xcode 4.5.2)


Another alternative that saves one file is to create a Nib and use registerNib:forCellReuseIdentifier: instead.

Making the Nib is easy: Create a new .xib file in Interface Builder. Delete the default view. Add a Table View Cell object. Using the Attributes Inspector, change the style for the cell. (Here you also have the opportunity to customize the cell further by adjusting other attributes.)

Then in your table view controller's viewDidLoad method call something like:

[self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"];

Bolot's answer is the correct. Simple and you don't need to create any XIB file.

I just wanted to update his answer for whoever is doing it using Swift instead of Objective-C:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .value1, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

My solution to this is to call initWithStyle: reuseIdentifier: after I've obtained it using [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]. After all, init is just another selector, and the compiler makes no restrictions on calling it on an already initialised object. It will however complain about not using the result of calling init, so I do:

UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];
cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"];

I imagine this won't work in Swift...

참고URL : https://stackoverflow.com/questions/13174972/setting-style-of-uitableviewcell-when-using-ios-6-uitableview-dequeuereusablecel

반응형