Objective c NSMutableArray removeObjectAtIndex和NSTabView
我的程序是带有MMTabBarView的web浏览器。 关闭选项卡的问题通过查看日志来关闭无效元素代码>调用时Objective c NSMutableArray removeObjectAtIndex和NSTabView,objective-c,macos,webview,nsmutablearray,nstabview,Objective C,Macos,Webview,Nsmutablearray,Nstabview,我的程序是带有MMTabBarView的web浏览器。 关闭选项卡的问题通过查看日志来关闭无效元素调用时[browserViews removeObjectAtIndex:index] 代码如下: h m 和日志: 程序将加载默认选项卡google.com: 2015-03-26 17:51:57.634 ERClient[89171:26065490]未选择选项卡视图项 索引0 2015-03-26 17:51:59.030电子客户[89171:26065490](电子浏览器: 0x60000
[browserViews removeObjectAtIndex:index]
代码如下:
h
m
和日志:
程序将加载默认选项卡google.com:
2015-03-26 17:51:57.634 ERClient[89171:26065490]未选择选项卡视图项
索引0
2015-03-26 17:51:59.030电子客户[89171:26065490](电子浏览器:
0x600000124060)
2015-03-26 17:52:02.278电子客户[89171:26065490]确实收到了标题
Gmail在新选项卡中打开:
2015-03-26 17:53:51.994电子客户[89171:26065490]
createWebViewWithRequest
2015-03-26 17:53:51.995 eClient[89171:26065490]未选择选项卡视图项
指标1
2015-03-26 17:53:52.035电子客户[89171:26065490](电子浏览器:
0x600000124060,ERBrowser:0x6000001CC0)
2015-03-26 17:53:53.987客户[89171:26065490]确实收到了标题
2015-03-26 17:53:56.451电子客户[89171:26065490]确实收到了标题
2015-03-26 17:53:59.003客户[89171:26065490]确实收到了标题-
我不明白为什么这种情况会发生3次而不是2次
关注索引为1的选项卡2,我将焦点更改为第一个选项卡索引0,然后返回:
2015-03-26 17:57:56.384电子客户端[89171:26065490]未选择选项卡视图项
索引0
2015-03-26 17:57:56.477电子客户[89171:26065490]索引变更焦点
表0
2015-03-26 17:57:58.206电子客户端[89171:26065490]未选择选项卡视图项
指标1
2015-03-26 17:57:58.207电子客户[89171:26065490]索引变更焦点
表1
现在我用索引1关闭选项卡2:
2015-03-26 17:58:55.691电子客户[89171:26065490]将关闭选项卡视图项
指标1
2015-03-26 17:58:55.691电子客户[89171:26065490](电子浏览器:
0x600000124060)1
2015-03-26 17:58:55.692电子客户端[89171:26065490]未选择选项卡视图项
索引0
2015-03-26 17:58:55.693电子客户[89171:26065490]索引变更焦点
表0
结果表明,使用有效标题打开选项卡1,但内容仍保留在选项卡2上:
如果我打开另一个标签,也会显示gmail
告诉我如何修复它,或者在哪里阅读发生这种情况的原因,问题本身就解决了。
这个问题是因为我在编程方面有点经验。
现在我将描述为什么不工作。
当您从NSMutableArray中删除一个对象时,该对象仍然保留在加载页面的WebView对象中。有必要添加[browserView removeFromSuperview]代码>
代码如下:
- (void)tabView:(NSTabView *)aTabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem
{
NSUInteger index = [aTabView indexOfTabViewItem:[tabView selectedTabViewItem]];
if ([browserViews count] > index)
{
ERBrowser *browserView = browserViews[index];
[browserViews removeObjectAtIndex:index];
[browserView removeFromSuperview];
}
}
也许将来有人会用Tab Bar创建一个Web浏览器。此外,您应该根据文档调用super方法:
/* Implemented methods from NSTabViewDelegate. These require a call to super if overriden by a subclass. */
- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem NS_REQUIRES_SUPER;
- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem NS_REQUIRES_SUPER;
- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem NS_REQUIRES_SUPER;
- (void)tabView:(NSTabView *)aTabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem
{
NSUInteger index = [aTabView indexOfTabViewItem:[tabView selectedTabViewItem]];
if ([browserViews count] > index)
{
ERBrowser *browserView = browserViews[index];
[browserViews removeObjectAtIndex:index];
[browserView removeFromSuperview];
}
}
/* Implemented methods from NSTabViewDelegate. These require a call to super if overriden by a subclass. */
- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem NS_REQUIRES_SUPER;
- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem NS_REQUIRES_SUPER;
- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(nullable NSTabViewItem *)tabViewItem NS_REQUIRES_SUPER;