簡體   English   中英

無法識別Objective-C類別屬性

[英]Objective-C Category property not recognized

我需要在一個視圖中有多個表並標識每個表,我在UITableView上添加了一個名為“ tableID”的屬性類別

這是類別代碼

。H

#import <UIKit/UIKit.h>
@interface UITableView (BrandsTView)
@property (nonatomic,strong) NSString *tableID;
@end

.m

#import "UITableView+BrandsTView.h"
@implementation UITableView (BrandsTView)
@dynamic tableID;
@end

在視圖控制器的初始化代碼中,我按如下所示設置屬性:

[self.hubTableView setTableID:@"tblHubBrands"];

當代碼到達表視圖委托的第一個方法時,tableID無法識別,並且嘗試按以下方式設置tblID時出現錯誤:

注意:tableID此時在代碼完成中可用,因此再次假設它將被識別

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    NSString *tblID = [tableView tableID]; // error: unrecognized selector
    if([tblID isEqualToString:@"tblHubBrands"]){
        return [hubBrands count];
    } else {
        //
    }
}

知道這里發生了什么嗎? 我假設tableID屬性在導入類別的任何類中都可用。

謝謝!

類別可用於聲明實例方法或類方法,但通常不適合於聲明其他屬性。 在類別接口中包含屬性聲明是有效的語法,但是無法在類別中聲明其他實例變量。 這意味着編譯器將不會合成任何實例變量,也不會合成任何屬性訪問器方法。 您可以在類別實現中編寫自己的訪問器方法,但除非該屬性已由原始類存儲,否則您將無法跟蹤該屬性的值。

向現有類添加由新實例變量支持的傳統屬性的唯一方法是使用類擴展,如“類擴展擴展內部實現”中所述。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html

正如其他人指出的那樣,您不能將實例變量添加到類別中的類。

我已經通過在運行時使用指向表視圖的指針解決了管理多個表視圖的問題。 我將指向這兩個表視圖的指針另存為IBOutlets,然后在我的表視圖數據源和委托方法的代碼中(它們均以指向該表視圖的指針作為它們的第一個參數),檢查是否有哪個表視圖在調用我,並且按指示行動。

例如:

VC的標頭可能包含以下內容:

@interface MyTwoTableViewVC: UIViewController;
{
  IBOutlet UITableView* firstTableView;
  IBOutlet UITableView* secondTableView;
}
@end

數據源方法的實現可能如下所示:

@implementation MyTwoTableViewVC
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  if (tableView == firstTableView)
     //return the number of rows in section for the first table view
  else if (tableView == secondTableView)
     //return the number of rows in section for the second table view
  else
     //error. We only have 2 table views!
}

此方法實質上使用表視圖的地址作為其ID。 在運行時,表視圖的地址不會更改,因此效果很好。

如果確定要在類別的表視圖中添加ID屬性,則可以在完成操作后定義@dynamic屬性,然后編寫使用關聯存儲將ID值讀取/寫入ID的自定義getter和setter。對象在運行時。 這有點駭人聽聞,並且對這個問題有點矯but過正,但它確實有效。

您要查看的方法是objc_getAssociatedObject()和objc_setAssociatedObject()。

我在github上有一個關聯的存儲演示項目 (這是該項目的鏈接。)

(該項目使用一類NSObject在運行時向任何NSObject添加關聯存儲支持。)

這是因為UITableView上沒有聲明tableID方法。 您所做的是先聲明一個屬性,然后使用@dynamic告訴編譯器該屬性的訪問器方法在其他地方實現,但實際上沒有地方實現。

同樣,您不能使用類別(需要添加工作屬性)將新的ivars添加到對象。 我建議子類化。

UITableView繼承自UIView只需將tag屬性設置為每個屬性都唯一。 更好的是,使用NS_ENUM定義自己的命名常量以用於標記。 您可以將枚舉放入全局常量.h文件中,然后將其導入任何地方。 現在,您可以通過代碼完成和可讀代碼獲得簡單快捷的標識符。 如果您需要一個字符串值來顯示某個足夠容易的地方,以基於檢查標記的簡單switch語句返回字符串。 您甚至可以使用可本地化的字符串函數返回字符串。

您可以使用關聯的對象將屬性添加到類別。 您可以在這里閱讀更多內容。
話雖如此,您應該遵循其他答案的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM