我目前正在从一本书中学习iOS开发。有一个代码让我困惑,我需要帮助。
因此,书中的说明要求读者首先创建单个视图应用程序。然后,它表示要拖动TableView
并将其放到ViewController
上。然后在选择表视图时,在Table View对象的View部分中为Tag值输入1。
在此之后,它说要访问作为故事板中ViewController
的控制器的实现文件,并添加一些代码。在那之前,对我来说一切都很好......
然而,有一次,它要求读者添加以下代码:
UITableView *tableView = (id)[self.view viewWithTag:1];
这是我需要帮助的代码。我明白它想要做什么。它正在选择View Controller中的Table View,但这不会返回UIView
类型的对象吗? UIView
类型的对象如何等于UITableView
对象?我认为它是UITableView
类型的一个对象,它可以“行动”为UIView
类型,因为UITableView
是UIView
....的孙子。
另外,(id)
部分的目的是什么?它是否将UIView
转换为id
类型的对象?为什么这有必要?
谢谢
答案 0 :(得分:2)
确定。 [self.view viewWithTag:1]
将返回UIView
,在此您知道tableview有标记1,它将被返回。你有这样的困惑,如果那是一个视图,那么我们如何将它分配给一个tableview。事情是UITableView
是UIView
的子类。因此,您可以从该方法分配UIView
的任何子视图。
id
的目的是,id
意味着你不知道将要返回什么。 id
表示任何类型。
所以简要解释(id)[self.view viewWithTag:1]
意味着从方法返回的UIView基本上被转换为"任何对象"。这样做是因为用户可能会混淆或忘记并使用标记1分配任何其他对象。
更精细的剪辑将是UITableView *myTableview = (UITableView *)[self.view viewWithTag:1]
。这是更微妙的,因为您已经知道标签1的视图是一个tableview。但将其转换为id更安全"。
希望可以清除你的困惑。检查类层次结构以便更好地理解here
正如Paulw11指出的那样,在这种意义上,转换为id并不严格,因为我们将它分配到tableview中,所以在你不知道对象是什么类的情况下,你将它分配给id,你可以在那个时候把它变成id。
例如。 id dontKnowWhatObject = (id)[self.view viewWithTag:1]