同一个ViewController.view可以作为单例添加到不同的视图中作为子视图吗?
Can the same ViewController.view be added as subview to different views as a Singleton?
我的应用程序有一个搜索视图(搜索栏),它在整个应用程序中使用。我不想创建重复的代码,所以我创建了一个名为 MySearchViewController 的视图控制器来处理搜索作业,然后我在 AppDelegate 中创建了一个单例对象。在每个视图控制器中,我都添加了这样的搜索视图:
- (void)viewDidLoad
{
MySearchViewController* search = [AppDelegate searchViewController];
[self.view addSubView:search.view];
}
我的问题,这是一个好方法吗?它是一个单例,因此可以添加到多个视图中。在添加到当前视图之前,我是否需要从上一个视图中删除该视图?
如果您想从不同的视图控制器添加视图,您的视图控制器必须是该视图控制器的父视图控制器:
- (void)viewDidLoad
{
MySearchViewController* search = [AppDelegate searchViewController];
[self addChildViewController:search];
[self.view addSubView:search.view];
}
另外,确保添加 search.view 时,它已经初始化。
为什么你不使用 NSObject class?,我不知道你的要求,但如果你想在整个项目(执行中)中存储最新更新的值,那么你应该使用单例,但是如果你不想存储值(我的意思是整个项目的一个结果)那么你应该使用 NSObject derived Class。优点是单例消耗内存所以会浪费内存。 NSObject class 将是可重用的,并且仅在需要时分配,然后 ARC 将处理所有事情。如果你想知道如何创建 NSObject 和使用它,那么你可以给我回复。
下面是一些代码,用于加载 XIB 作为自定义对象的一部分,并初始化该对象。
为什么不为搜索创建自定义搜索组件?
您可以在整个应用程序中使用此组件。
这也不是在创建重复代码。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[[[NSBundle mainBundle] loadNibNamed:@"SearchView" owner:self options:nil] objectAtIndex:0];
[self addSubview:self.view];
self.frame = self.view.frame;
}
return self;
}
了解您正在混合一些不一定相关的概念:避免重复代码和单例。
维基百科关于单身人士的说法:
In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects. The term comes from the mathematical concept of a singleton.
单例最重要的特征(以我的拙见)是对象只被实例化一次,应用程序中的每个地方都将使用同一个实例。好吧,要在任何地方使用搜索功能并避免重复代码,您不需要只实例化搜索视图一次,也许是它附带的数据,而不是视图本身。
两种更好的实现方式:
1 - 您可以通过搜索创建一个 ViewController,然后使用容器视图将其嵌入到其他视图中,您可以使用块或委托协议在控制器和视图之间进行通信嵌入它。
2 - 您可以创建 ViewController 的父级 class,它将包含搜索栏,例如 SearchViewController,所有其他需要相同功能的视图控制器将继承自它。
如果您打算在应用程序的所有 ViewController 之间共享相同的搜索数据和文本,则单例可能会很有用,但只有这些信息、UISearchBar 和所有其他视图元素不应是单例的一部分。
请检查以下代码。希望这对你有用。
- (void)viewDidLoad
{
if ([self.view viewWithTag:123456]) {
[[self.view viewWithTag:123456] removeFromSuperview];
}
MySearchViewController* search = [AppDelegate searchViewController];
search.view.tag = 123456; // give a any random tag to view
[self.view addSubView:search.view];
[self addChildViewController:search];
}
请确保给定的标签没有分配给 self.view 中 search.view 以外的其他对象。
谢谢
理想情况下,每次要将 MySearchViewController 添加到另一个视图时都应该实例化一个新实例以避免出现问题。
在添加到当前视图之前是否需要从上一个视图中删除视图?
它不需要从以前的超级视图中删除它,因为每当您将此单例 MySearchViewController 的视图添加到其他视图时,它会自动从上一个超级视图中删除,现在它的超级视图是您添加的新视图它。
我的应用程序有一个搜索视图(搜索栏),它在整个应用程序中使用。我不想创建重复的代码,所以我创建了一个名为 MySearchViewController 的视图控制器来处理搜索作业,然后我在 AppDelegate 中创建了一个单例对象。在每个视图控制器中,我都添加了这样的搜索视图:
- (void)viewDidLoad
{
MySearchViewController* search = [AppDelegate searchViewController];
[self.view addSubView:search.view];
}
我的问题,这是一个好方法吗?它是一个单例,因此可以添加到多个视图中。在添加到当前视图之前,我是否需要从上一个视图中删除该视图?
如果您想从不同的视图控制器添加视图,您的视图控制器必须是该视图控制器的父视图控制器:
- (void)viewDidLoad
{
MySearchViewController* search = [AppDelegate searchViewController];
[self addChildViewController:search];
[self.view addSubView:search.view];
}
另外,确保添加 search.view 时,它已经初始化。
为什么你不使用 NSObject class?,我不知道你的要求,但如果你想在整个项目(执行中)中存储最新更新的值,那么你应该使用单例,但是如果你不想存储值(我的意思是整个项目的一个结果)那么你应该使用 NSObject derived Class。优点是单例消耗内存所以会浪费内存。 NSObject class 将是可重用的,并且仅在需要时分配,然后 ARC 将处理所有事情。如果你想知道如何创建 NSObject 和使用它,那么你可以给我回复。
下面是一些代码,用于加载 XIB 作为自定义对象的一部分,并初始化该对象。
为什么不为搜索创建自定义搜索组件?
您可以在整个应用程序中使用此组件。 这也不是在创建重复代码。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[[[NSBundle mainBundle] loadNibNamed:@"SearchView" owner:self options:nil] objectAtIndex:0];
[self addSubview:self.view];
self.frame = self.view.frame;
}
return self;
}
了解您正在混合一些不一定相关的概念:避免重复代码和单例。
维基百科关于单身人士的说法:
In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system. The concept is sometimes generalized to systems that operate more efficiently when only one object exists, or that restrict the instantiation to a certain number of objects. The term comes from the mathematical concept of a singleton.
单例最重要的特征(以我的拙见)是对象只被实例化一次,应用程序中的每个地方都将使用同一个实例。好吧,要在任何地方使用搜索功能并避免重复代码,您不需要只实例化搜索视图一次,也许是它附带的数据,而不是视图本身。
两种更好的实现方式:
1 - 您可以通过搜索创建一个 ViewController,然后使用容器视图将其嵌入到其他视图中,您可以使用块或委托协议在控制器和视图之间进行通信嵌入它。
2 - 您可以创建 ViewController 的父级 class,它将包含搜索栏,例如 SearchViewController,所有其他需要相同功能的视图控制器将继承自它。
如果您打算在应用程序的所有 ViewController 之间共享相同的搜索数据和文本,则单例可能会很有用,但只有这些信息、UISearchBar 和所有其他视图元素不应是单例的一部分。
请检查以下代码。希望这对你有用。
- (void)viewDidLoad
{
if ([self.view viewWithTag:123456]) {
[[self.view viewWithTag:123456] removeFromSuperview];
}
MySearchViewController* search = [AppDelegate searchViewController];
search.view.tag = 123456; // give a any random tag to view
[self.view addSubView:search.view];
[self addChildViewController:search];
}
请确保给定的标签没有分配给 self.view 中 search.view 以外的其他对象。
谢谢
理想情况下,每次要将 MySearchViewController 添加到另一个视图时都应该实例化一个新实例以避免出现问题。
在添加到当前视图之前是否需要从上一个视图中删除视图?
它不需要从以前的超级视图中删除它,因为每当您将此单例 MySearchViewController 的视图添加到其他视图时,它会自动从上一个超级视图中删除,现在它的超级视图是您添加的新视图它。