小编Ben*_*ard的帖子

NSArrayController和KVO

在调用更新底层数组的方法时,如何更新绑定到NSArrayController的tableView需要做什么?一个例子可能会澄清这一点.

当我的应用程序启动时,它会创建一个SubwayTrain.当SubwayTrain初始化时,它会创建一个SubwayCar.SubwayCar有一个可变的阵列'乘客'.当地铁车辆初始化时,乘客阵列被创建,并且放入几个人物对象(假设有一个名为"票务收集者"的人和另一个名为"无家可归者"的人).这些人总是在SubwayCar上,所以我在初始化时创建它们并将它们添加到乘客阵列.

在应用程序的生命周期中,人们登上了汽车.在SubwayCar上调用'addPassenger',并将此人作为参数传入.

我有一个NSArrayController绑定到subwayTrain.subwayCar.passengers,并在启动时我的收票员和无家可归的人显示正常.但是当我使用[subwayCar addPassenger:]时,tableView不会更新.我已经确认乘客肯定被添加到阵列中,但是在gui中没有任何更新.

我可能做错了什么?我的直觉是它与KVO相关 - 当调用addPassenger时,阵列控制器不知道更新(即使addPassenger调用[passenger addObject:].我在这里可能会出错 - 如果有帮助我可以发布代码).

感谢愿意帮忙的人.

UPDATE

所以,事实证明我可以通过改变addPassenger方法来实现这一点

[seatedPlayers addObject:person];
Run Code Online (Sandbox Code Playgroud)

NSMutableSet *newSeatedPlayers = [NSMutableSet setWithSet:seatedPlayers];

[newSeatedPlayers addObject:sp];

[seatedPlayers release];

[self setSeatedPlayers:newSeatedPlayers];
Run Code Online (Sandbox Code Playgroud)

我想这是因为我正在使用[self setSeatedPlayers].这是正确的方法吗?复制数组,释放旧数组并更新副本(而不是仅添加到现有数组)似乎非常麻烦.

cocoa key-value-observing nsarraycontroller cocoa-bindings

5
推荐指数
2
解决办法
2930
查看次数

使用辅助功能API设置最前面的窗口

我想设置一个窗口,从外部应用程序(例如textedit),到最前面.

我可以使用GetFrontProcess成功获取对应用程序本身的引用,并检查它是否是最前面的.如果不是,我可以使用setFrontProcess使其聚焦.

然后,我可以使用辅助功能API来检查该应用程序下的所有窗口.我正在检查某个窗口是否存在,如果存在,我将它与应用程序的最前面窗口进行比较:

//get the front window of textEditApp and store it in 'currentFrontWindow'
    AXUIElementCopyAttributeValue(textEditApp, kAXFocusedWindowAttribute, (CFTypeRef *)&currentFrontWindow);
Run Code Online (Sandbox Code Playgroud)

如果我感兴趣的窗口不是最前面的,我需要设置它.我认为我可以使用AXUIElement Set AttributeValue来做到这一点,但我没有取得任何成功.以下是我尝试过的方法.

//set the front window of textEditApp to be desiredFrontWindow
AXUIElementSetAttributeValue(textEditApp, kAXFocusedUIElementAttribute, desiredFrontWindow);
Run Code Online (Sandbox Code Playgroud)

我已检查窗口是否存在,并且应用程序已成功"切换到".但为什么这行代码没有将指定的窗口带到前面?

谢谢.

cocoa accessibility macos-carbon

5
推荐指数
2
解决办法
2676
查看次数

分层自动提示

我正在快速搜索框上设计自动提示功能.建议将包括小图标,多行文字等.该应用程序正在处理订单.搜索字段将识别各种不同的有意义的术语 - 例如客户姓氏,订单ID等.但是当输入订单ID时,我希望用户有机会查看订单或人员.我想我想要列表中的层次结构 - 所以如果我输入1234,并且它匹配3个不同的人的5个订单,则3个人返回顶层,他们的5个订单位于相应的客户下面.

快速模型:

替代文字

有没有人在其他地方看到这样的事情?不想重新发明轮子.也对任何其他反馈感兴趣.

search user-experience autosuggest

5
推荐指数
1
解决办法
263
查看次数

如何判断UILabel何时被截断和/或其换行位置将会改变

我有一个多行UILabel(numberOfLines= 0).它的宽度可以在运行时更改,有时这会导致截断和/或重新包装.一些例子说明了这一点:

示例1:宽度的减小导致不同的断点

在此输入图像描述 在此输入图像描述

例2:宽度的减小导致截断

在此输入图像描述 在此输入图像描述

例3:宽度的减小导致截断和不同的断线位置

在此输入图像描述 在此输入图像描述

示例4:宽度的减小对截断或断线位置没有任何影响

在此输入图像描述 在此输入图像描述

由于格式化的这种变化可能非常刺耳,我打算在一些动画后掩盖它(可能是淡入/淡出).然而,第一个障碍是确定何时需要这样做.我不想在标签重新调整大小时应用动画 - 只有当它会导致截断或换行位置发生变化时才会应用动画.

我该怎么测试呢?测试应该返回YES,例如1,2和3,但是例如4的NO.

注意:调整大小永远不会改变我的示例中的行数.

注意2:如果有人有一些与文本格式相关的更好的标签,我很想知道它们 - 随意编辑.

注3:如果您对完成此行为感兴趣,请在iPhone上试用Apple的mail.app.查看收件箱时,滑动电子邮件并在重新包装和/或截断时观看汇总行淡入/淡出(但不是在不需要时).

cocoa-touch objective-c uiview uilabel ios

5
推荐指数
1
解决办法
5761
查看次数

使用仪器对性能进行基准测试

我正在寻找有关如何使用仪器的Time Profiler来增强特定操作的一些建议.我有一个分页滚动视图,可以按需加载其内容.当滚动到新页面时,另一个页面将向右加载两页.当当前页面滚动50%的屏幕时会发生这种情况,而在较慢的设备上,加载足够瓶颈会中断滚动的平滑度.滚动感觉就像它在50%品脱时非常短暂地暂停,然后跳回到行动中.

我应该注意到我的应用程序没有网络组件,因此在获取数据时瓶颈不是 - 它都在加载新视图.

当我努力改进这一点时,我需要对转换进行基准测试,以便我可以评估增强功能的效果.观看了WWDC会议后,我了解了时间分析器的基本知识,但我并不相信我正在寻找正确的事情.

我正在运行仪器,然后执行滚动.我看到了CPU活动的预期峰值.然后我选择尖峰并查看符号名称.正如您在下面看到的,当我隐藏系统库并显示Obj-C时,我正在处理一个短暂的90%尖峰,运行时间为81.0毫秒.

在此输入图像描述

当我深入到我的代码时,我的困惑就出现了.我发现最大的贡献者之一(23毫秒)是一个只使用的小例程sortedArrayUsingDescriptors.我无能为力.其他时候根本原因是我使用CGRectInset - 几毫秒.我想我希望看到更多与图像使用或类似的东西有关.

我想我不知道我是否正确对待正确的事情.我真的打算尝试将我的6ms操作减少到5ms并期望看到差异吗?我正在寻找合适的工具来诊断我的问题吗?

关于衡量什么以及在哪里集中精力的任何提示或指示都将受到重视.

iphone performance cocoa objective-c ios

5
推荐指数
1
解决办法
259
查看次数

使用自动布局时如何在加载时滚动UIScrollView

我有一个UIScrollView,它在a的viewDidLoad方法中设置UIViewController(我称之为a ScrollViewController).滚动视图包含水平内容的页面(类似于本机天气应用程序).

显示滚动视图时,应该可以选择它开始的页面.我的模式是这样的:

  • 初始化一个ScrollViewController.这里没有什么事情发生.一个currentPage属性被默认为0.
  • 设置scrollViewController.currentPage为所需的页码.
  • viewDidLoadScrollViewController,阅读self.currentPage和使用scrollToRect或者setContentOffset相应地滚动.

滚动实现看起来很好,因为我在其他地方使用相同的代码跳转到某些页面.但是在第一次加载时,没有任何反应(也就是说,滚动视图不会滚动到所需的页面).

我已经找到了原因 - 看起来contentSize滚动视图(由autolayout推导出来的)在0期间是0 viewDidLoad,这似乎阻止了滚动.在viewWillAppear期间它也是零.仅在viewDidAppear滚动工作中,这当然会产生奇怪的用户体验.

我该如何解决这个问题?以某种方式强制布局是明智的viewDidLoad吗?还是其他一些方法?

cocoa-touch uiscrollview uiviewcontroller ios autolayout

5
推荐指数
1
解决办法
1110
查看次数

如何检查NSPasteboard是否已更新?

我正在自动执行复制命令,每隔一秒左右在粘贴板上放置一些文本 - 不幸的是,这是我访问文本的唯一方法,这是在另一个应用程序中.复制后,我访问粘贴板文本并进行处理.

有时,复制命令将在未选择任何内容时发送 - 例如在textEdit中,如果光标位于一行的末尾(而不是突出显示某些文本)并且您点击了复制,则会发出系统蜂鸣声,因为没有选择任何内容复印.粘贴板不会更新并保留其以前的数据.

我无法想出一种创造性的方法来确定何时发生这种情况.如果我发送一个复制命令并且粘贴板没有更新,我可以访问的粘贴板上是否有任何类型的时间戳,以确认是否已捕获某些内容?

我正在看changeCount,但我不确定究竟是什么,文档对我没有多大帮助 - 红鲱鱼?

任何简单有效的想法都会感激不尽!

cocoa objective-c nspasteboard

4
推荐指数
1
解决办法
1446
查看次数

创建没有笔尖的视图控制器

在AppDelegate中,我想创建一个UIViewController子类并添加它的视图.viw本身将在代码中指定 - 没有笔尖.

根据苹果文档,我应该使用

initWithNibName:nil bundle:nil];
Run Code Online (Sandbox Code Playgroud)

然后在控制器的loadView中,我添加我的子视图等.

但是,下面的后续测试代码对我不起作用.我在Apple的PageControl演示中对AppDelegate代码进行了建模,仅仅是因为我的应用程序将实现类似的结构(特别是用于管理分页滚动视图的基本控制器,以及用于构建页面的其他控制器阵列).

但我怀疑我的AppDelegate代码是问题,因为日志记录证明initWithNibName ::和loadView都会触发.下面的应用程序运行,但屏幕为空白.我期待带有标签的绿色视图.

AppDelegate中

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        ScrollerController *controller = [[ScrollerController alloc] initWithNibName:nil bundle:nil];
        [self.window addSubview:controller.view];
        [self.window makeKeyAndVisible];
        return YES;
    }
Run Code Online (Sandbox Code Playgroud)

ScrollerController(UIViewController子类)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)loadView{
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    UIView *contentView = [[UIView alloc] initWithFrame:applicationFrame];
    contentView.backgroundColor = [UIColor greenColor];
    self.view = contentView;

    UILabel *label = …
Run Code Online (Sandbox Code Playgroud)

model-view-controller uiviewcontroller uiview ios ios5

4
推荐指数
1
解决办法
1万
查看次数

在4英寸iPhone屏幕上淡出启动图像

在发布时,我正从我的启动图像淡入应用程序的界面.为了达到这个目的,我正在添加一个UIImageView"Default.png"并在之前动画化它的alpha makeKeyAndVisible.

Default.png是否应始终返回启动映像的特定于设备(或特定于分辨率)的版本?或者我应该检查屏幕的界限和比例来选择合适的视网膜与非视网膜和3.5英寸4英寸屏幕?

我希望Default.png的行为与其他图像资源非常相似 - 支持时使用@ 2x版本(以及iPhone 5上的-568h版本).但是我在模拟器中的实验让我相信不然.运行4英寸模拟器,使用3.5英寸图像.这会导致飞溅图像不会延伸到屏幕底部.下面的屏幕截图显示了动画中期动画.

在此输入图像描述

不幸的是我没有每个设备所以无法确认这是否只是模拟器的一个怪癖.

简而言之,我想确保视网膜图像用于视网膜设备,4英寸图像用于4英寸设备.

iphone cocoa-touch uiimageview ios ios6

4
推荐指数
1
解决办法
2415
查看次数

使用Xcode将当前分支合并到Master

是否有使用Xcode将当前工作分支合并到master分支的快速方法?我不清楚'Merge'菜单选项的功能到底是什么(没有明确标记),但似乎正在将您选择的任何分支合并到当前分支中-我想这在您要测试时很有用您使用他人的最新代码库进行的更改。

完成功能后,我想将其合并到母版中,然后继续使用其他功能。看来我必须切换到master分支,从那里合并,然后从master分支到另一个分支,然后在那个分支中处理功能#2。

我正确吗?

git version-control xcode

4
推荐指数
2
解决办法
5714
查看次数