Anladığım kadarıyla:
- Birden çok film şeridi sahnesinde kullanılabilen IB'de bir hücre tasarlayın.
- Hücrenin bulunduğu sahneye bağlı olarak, o hücreden benzersiz film şeridi sekmelerini yapılandırın.
Ne yazık ki, şu anda bunu yapmanın bir yolu yok. Önceki girişimlerinizin neden işe yaramadığını anlamak için film şeridi ve prototip tablo görünümü hücrelerinin nasıl çalıştığı hakkında daha fazla bilgi sahibi olmanız gerekir. ( Bu diğer girişimlerin neden işe yaramadığı konusunda umursamıyorsanız , şimdi ayrılmaktan çekinmeyin. Sizin için hiçbir hata dosyası önermekten başka sihirli bir çözümüm yok.)
Bir film şeridi, özünde, .xib dosyalarının bir koleksiyonundan çok daha fazlası değildir. Film şeridinden bazı prototip hücreleri olan bir tablo görünümü denetleyicisi yüklediğinizde, şunlar olur:
- Her prototip hücresi aslında kendi gömülü mini ucudur. Böylece tablo görünümü denetleyicisi yüklenirken, prototip hücresinin uçlarının ve çağrılarının her biri boyunca çalışır
-[UITableView registerNib:forCellReuseIdentifier:]
.
- Tablo görünümü denetleyiciden hücreleri ister.
- Muhtemelen araıyorsun
-[UITableView dequeueReusableCellWithIdentifier:]
Belirli bir yeniden kullanım tanımlayıcısına sahip bir hücre talep ettiğinizde, bir ucunun kayıtlı olup olmadığını kontrol eder. Varsa, o hücrenin bir örneğini başlatır. Bu, aşağıdaki adımlardan oluşur:
- Hücrenin ucunda tanımlandığı gibi hücre sınıfına bakın. Arayın
[[CellClass alloc] initWithCoder:]
.
-initWithCoder:
Yöntem geçer ve kalem ucundaki tanımlandı subviews ve setler özelliklerini ekler. ( IBOutlet
muhtemelen test etmeme rağmen buraya da bağlandım; olabilir -awakeFromNib
)
Hücrenizi istediğiniz gibi yapılandırırsınız.
Burada dikkat edilmesi gereken önemli şey , hücrenin sınıfı ile hücrenin görsel görünümü arasında bir ayrım olmasıdır . Aynı sınıftan iki ayrı prototip hücre oluşturabilirsiniz, ancak alt görünümleri tamamen farklı şekilde düzenlenmiştir. Aslında, varsayılan UITableViewCell
stilleri kullanırsanız, olan tam olarak budur. Örneğin, "Varsayılan" stil ve "Altyazı" stilinin ikisi de aynı UITableViewCell
sınıf tarafından temsil edilir .
Bu önemlidir : Hücre sınıfının belirli bir görünüm hiyerarşisi ile bire bir ilişkisi yoktur . Görünüm hiyerarşisi, tamamen bu özel denetleyiciye kaydedilen prototip hücresindekiler tarafından belirlenir.
Ayrıca, hücrenin yeniden kullanım tanımlayıcısının bazı küresel hücre dispanserinde kayıtlı olmadığını unutmayın. Yeniden kullanım tanımlayıcısı yalnızca tek bir UITableView
örnek bağlamında kullanılır .
Bu bilgi göz önüne alındığında, yukarıdaki girişimlerinizde neler olduğuna bakalım.
Denetleyici # 1'de, bir prototip hücre ekledim, sınıfı UITableViewCell alt sınıfıma ayarladım, yeniden kullanım kimliğini ayarlayın, etiketleri ekledik ve sınıfın çıkışlarına bağladım. Denetleyici # 2'de boş bir prototip hücresi ekledi, onu aynı sınıfa ayarlayın ve kimliği önceki gibi yeniden kullanın. Çalıştığında, hücreler Denetleyici # 2'de gösterildiğinde etiketler asla görünmez. Denetleyici # 1'de iyi çalışıyor.
Bu bekleniyor. Her iki hücre de aynı sınıfa sahip olsa da, Denetleyici # 2'deki hücreye aktarılan görünüm hiyerarşisi tamamen alt görünümlerden yoksundu. Yani boş bir hücreniz var, bu da tam olarak prototipe koyduğunuz şey.
Her hücre tipini farklı bir NIB'de tasarladı ve uygun hücre sınıfına kadar kabloladı. Film şeridinde boş bir prototip hücre ekledi ve sınıfını ayarlayın ve kimliğimi hücre sınıfımla ilgili olarak yeniden kullanın. Denetleyicilerin viewDidLoad yöntemlerinde, yeniden kullanım kimliği için bu NIB dosyalarını kaydettirin. Gösterildiğinde, her iki denetleyicideki hücreler prototip gibi boştu.
Yine, bu bekleniyor. Yeniden kullanım tanımlayıcısı film şeridi sahneleri veya uçları arasında paylaşılmaz, bu nedenle bu farklı hücrelerin hepsinin aynı yeniden kullanım tanımlayıcısına sahip olması anlamsızdı. Tablo görünümünden geri aldığınız hücre, film şeridinin o sahnesindeki prototip hücreyle eşleşen bir görünüme sahip olacaktır.
Ancak bu çözüm yakındı. Belirttiğiniz gibi, sadece hücre içeren hücreyi -[UITableView registerNib:forCellReuseIdentifier:]
geçirerek programlı olarak arayabilir UINib
ve aynı hücreyi geri alabilirsiniz. (Bu, prototipin ucu "geçersiz kıldığı" için değildir; sadece ucu masa görüntüsüne kaydettirmediniz, bu yüzden hala film şeridine gömülmüş uca bakıyordu.) Ne yazık ki, bu yaklaşımda bir kusur var - film şeridi segu'lerini bağımsız bir uçtaki bir hücreye bağlamanın bir yolu yoktur.
Her iki denetleyicideki prototipler boş bırakılır ve sınıf ayarlanır ve id, hücre sınıfım için yeniden kullanılır. Hücrelerin kullanıcı arayüzünü tamamen kodla yapılandırdı. Hücreler tüm kontrolörlerde mükemmel çalışır.
Doğal olarak. Umarım, bu şaşırtıcı değildir.
Bu yüzden işe yaramadı. Hücrelerinizi bağımsız uçlarda tasarlayabilir ve birden fazla storyboard sahnesinde kullanabilirsiniz; şu anda storyboard segu'lerini bu hücrelere bağlayamazsınız. Umarım, bunu okuma sürecinde bir şeyler öğrendiniz.