Tag: cocoa触摸

现代可可观点中的一项习题

最初发布在这里: https : //avaidyam.github.io/2018/03/22/Exercise-Modern-Cocoa-Views.html 就像我在上一个“片段”中所说的那样,最近,我想开始为Parrot添加“热键”支持,并且意识到我不喜欢任何现有解决方案: 使用MASShortcut尝试并证明可在ObjC-land工作的MASShortcut或ShortcutRecorder 。 使用新的但未经验证的Swift热键记录器(那里有一些)。 自己动手(可能以某种方式使用危险的专用SPI)而不进行任何测试! 显然,我选择了#3。 在这里,我们进入了激动人心的传奇的第二部分,您在其中见证了我打破AppKit和WindowServer并引起从事上述组件工作的工程师的愤怒和愤怒。 我希望你带了爆米花。 我想澄清一下,我们将只构建一个管理单个快捷方式的独立控件。 我希望Parrot与大多数应用程序一样,将不需要像Final Cut Pro这样的命令编辑器,该命令编辑器是专门为视频编辑器而专门设计的,该视频编辑器具有两个以上的键盘和两个以上的两只手可以匹配。 我们的最终结果将是看起来,听起来和感觉像这样,而不是: 在进入精妙的手工对编程之前,如果您想直接跳转到带注释的最终源代码,我将在此处提供一个快照。 这是整个最终产品,精确到1500 LOC,包括之前“ episode”中的代码-相应的键盘快捷键功能! 如果您认为这应该是正式的存储库而已,请通过Twitter或Github @avaidyam与我联系! 现代观点原理 子类化View或ViewController 我们应该回答的第一个问题是,我们要构建什么样的组件? 这个问题的答案是什么决定了我们是什么样的子类,以及我们与应用程序中其他组件的交互模型。 当您构建一个采用程序输入并向用户显示内容的分立组件时,对于控件而言,当您接收用户输入并显示程序输出时,您应该将View子类化。 除此之外的任何东西都应该是ViewController的子类,介导其他组件之间的交互的组件,或处理模型/数据库对象的组件,或者实际上只是其他任何东西。 View应该可以在您要立即构建的环境之外的其他环境中轻松重用,但是ViewController不一定能够履行此合同。 例如,联系人头像最好是View子类,但是联系人头像选择器应该是ViewController ,因为它不仅显示头像图像,而且还允许用户选择图像,并且可以处理与头像的同步。联系人存储(可能是JSON文件,可能是远程API,或者可能是CNContact )。 在macOS上,如果要构建的组件既包含其他组件(例如ViewController )又包含在Window ,则还应考虑将WindowController子类化-联系人头像选择器可能不符合此条件,但需要联系人编辑器面板联系人头像选择器将是一个ViewController嵌套在姓名,电话,电子邮件和其他可编辑字段旁边。 层数 虽然与年轻的兄弟姐妹UIKit相比, AppKit通常被视为恐龙,但重要的是要知道, UIKit所使用的几乎所有设计模式几乎都来自AppKit ,如果不是,它们最终会回到AppKit ,除了极少数。 例如,由底层CALayer类型支持的UIView的概念与由NSCell支持(而是过去?)的NSControl非常相似。 不同之处在于CALayer实际上是驱动显示内容的呈现而不是UIView的呈现,并且NSCell充当特定事件处理和绘制的“橡皮图章”。 当涉及到层支持的视图时, AppKit实际上有几种模式可以实现此目的: 层托管: self.layer = CALayer(); self.wantsLayer = true NSView拥有CALayer ,并负责创建和管理它。 […]

可可触摸(WWDC 2017 Session 201)TL; DR中的新增功能

以下是WWDC 2017(会议201)的大部分“可可接触新功能”会议的快速回顾。 这都是现场输入的内容,因此,如果某些内容不正确,请随时纠正我。 生产率 拖放 通过创建UIDragInteraction(UIInteraction的子类)并将其附加到您希望具有Draggable的视图(并分配其委托),来启用Drag。 委托人提供拖动项目的数据,允许自定义“提升”动画并自定义draggin预览。 通过创建UIDropInteraction并以类似方式设置其委托来启用Drop。 委托允许在拖动移动时更新UI,接收拖放上的常规数据并自定义拖放动画。 开箱即用地支持许多UIKit元素-TableView,CollectionView,TextView,TextField和WebView。 文件管理 引入了新的文件资源管理器,该文件资源管理器允许在我们的应用程序中进行演示。 UIDoumentBrowserViewController是我们可以在应用程序中显示的ViewController。 它是高度可定制的,并允许访问设备内容,iCloud内容和外部云服务。 协调文件访问至关重要,因为我们不能指望我们的应用程序是唯一可以触摸某些文件/资产的应用程序。 可以通过使用NSFileCoordinator / UIDocument来完成。 用户界面优化 大标题导航栏可以具有内置的搜索栏,但是当您向上滚动内容时,搜索栏将随着大标题折叠为常规小标题而折叠,就像我们习惯于iOS 10。 在大多数情况下,这几乎可以自动完成,因为系统可以通过将UINavigationBar.prefersLargeTitle设置为true来自动处理它。 您还可以使用UINavigationItem.largeTitleDisplayMode来围绕导航级别以更精细的方式控制大标题显示模式。 通过设置UINavigationBar.searchBarController启用统一搜索栏。 通常,导航控制器/堆栈中的顶部控制器将是唯一使用“大型”样式标题的控制器,而内部控制器应使用标准的小变化。 导航栏中有一个内置的Pull-to-refresh,看起来很棒。 我们不能一直指望导航栏的静态高度,因为它可能会更改不同内容类型的高度。 在大多数情况下,这将由各种UINavigation类自动处理。 UIView上有一个新的safeAreaInsets.top属性,我们可以准确而可靠地使用它来通过导航栏知道“模糊”区域的大小。 还有一个底线值。 ( safeAreaInsets.bottom ) 您也可以使用safeAreaLayoutGuide 。 对于手动布局,您可以手动阅读safeAreaInsets并订阅安全区域大小的更改。 现在, UINavigationController不再像使用安全插入一样控制插入值,因此在Scroll View上设置手动插入应该不再像以前那样费时了。 UIScrollView具有称为contentInsetAdjustmentBehavior和contentInsetAdjustmentBehavior新属性,可用于手动定义插图在UIScrollView上的行为。 UITableViewCell现在支持使用新的UIContextualAction类在左侧和右侧进行内置的滑动操作。 看起来与UITableRowAction工作原理类似,但是更加精致,因为您可以单独使用UISwipeActionsConfiguration对这些UIContextualAction进行分组。 UITableView上有一个新的属性,称为“ separatorInsetReference ,可让您设置插图的值是绝对值还是“增量”,例如,在引用中,插图将是以前的插图。 斯威夫特4和基金会 归档Swift本机类型 新的Codable协议允许更轻松地“存档”和“取消存档”,并且默认情况下允许他们参与NSCoding。 关键路径 新的KeyPath类型具有用于文字语法的选项(例如\Object.path.subPath ),因此您可以动态创建一个密钥路径,然后使用collection[keyPath: someKeyPath] 。 使用object.obserer(keyPath) { […]

尝试查看.xcdatamodel时,XCode崩溃

我有一个由Core Data支持的应用程序,我已经工作了一段时间。 我使用版本控制(以前的SVN,现在是Git)在不同的Mac之间移动它。 前几天,我无法打开这个项目。 OH CRAP。 幸运的是,由于Time Machine,我能够及时回归,并恢复到早期版本。 我怀疑XCode项目文件或核心数据文件的某些东西在这里发挥作用(我遇到了这个人做过的一些问题,我猜),但是一切似乎都在工作,所以我继续前进。 但是现在,我意识到当我尝试在XCode中打开.xcdatamodel文件时,我不能。 它只是挂起然后我结束强制戒烟。 除此之外,该应用程序完全正常。 我可以将它部署到模拟器或设备,它的工作原理。 但我不知道我对编辑有什么希望。 我可以做些什么来解决这个问题?

NSUrlRequest:应用程序可以在哪里找到HTTP请求的默认标头?

有人知道iOS应用程序可以看到NSUrlRequest为HTTP请求设置的默认标头吗? 只需使用“http:// ..” NSURL创建NSUrlRequest ,然后询问: [request allHTTPHeaderFields]返回一个空字典。 但我知道例如“Accept-Encoding”设置为“gzip” 。 所以我希望得到所有这些字段并在HTTP请求演示中显示它们。 我也试图[NSMutableURLRequest setValue:forHTTPHeaderField:] ,但它似乎没有被底层API(NSURLRequest或NSURLConnection)用来设置我正在寻找的那些默认字段。 我正在制作一个简单的iOS演示,其中显示了HTTP请求和响应信息,因此如果它是用于此的公共或私有API并不重要。

StatusBar在iOS7中的错误?

我已经被苹果正在制作状态栏覆盖viewController …或者我的应用程序的界限的事实。 有什么方法可以将StoryBoard中的TitleBar向下移动? 还是我不得不猜猜在哪里放置它? 我很困惑该怎么做,现在iOS7已经到来了。 这是我在应用程序和故事板中的TitleBar: 和: 我该怎么做这个工作? 这是我希望它看起来像没有绿色,但黑色。 我什至试过这个post,但没有任何帮助。 iOS 7 – 调整状态栏

Swift:cellForRowAtIndexPath不按indexPaths的顺序调用

首先,indexpath按照0,1,2 …的顺序调用,但是在点击table view之后,func tablview被调用,其索引path似乎是完全随机的,因此我无法重现相同的数据。 我正在使用数组关联表的行。 代码在这里: // MARK: – Table view data source override func numberOfSectionsInTableView(tableView: UITableView!) -> Int { // #warning Potentially incomplete method implementation. // Return the number of sections. return 1 } override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete method implementation. // Return the number of […]

如果同时触发滑动手势和后退button,则导航栏会变得时髦

今天我们的一个testing人员告诉我,如果他按下导航栏的后退button的同时向后滑动,则会在导航栏中创build一个非常有趣的行为: 如果我们在第三个视图控制器上,并执行此操作比返回顶部,再次进入一个级别,并在大多数情况下单击后退button导航栏不会消失,如果它应该,或者它可能不会animation。 或者不在更深层次上出现。 或者取消激活后退button,尽pipe不在顶部视图控制器中。 有时这些消息被打印到控制台: 完成处于意外状态的导航转换。 导航栏子视图树可能会损坏。 事实certificate,它必须在苹果类,因为我能够用简单的课程重现它。 代码在GitHub上 。 您将不得不在手机上运行应用程序来一次执行手势和button点击。 我也准备了一个video 。 我如何解决它?

JSON对NSObject数据模型的表示

我正试图parsing我的数据模型中填充的所有数据。 在nsobject中我有一些nsmutabledictionary,只是好奇是否有可能获得该对象types的jsonrepresentation? 我使用ASIHTTPREQUEST得到了无效的JSONtypes。 所以这里显而易见的问题是,如果这是可能的,或者我必须遍历对象的,并在nsdictionary中插入,然后parsing它? 谢谢

UITableView不呈现

所以我有一个UITableView作为接口生成器中另一个视图的子视图,而不是渲染。 我已经检查过,section方法的返回数是1,并且section方法中的行数返回一个大于0的数。 这是我的代码 – – (void)viewDidLoad{ //[super viewDidLoad]; _trendingImageView.image = [UIImage imageNamed:@"trending.png"]; [self.scrollView setScrollEnabled:YES]; [self.scrollView setClipsToBounds:YES]; self.scrollView.delegate = self; UINib *nib = [UINib nibWithNibName:@"RecommendationCell" bundle:nil]; [self.recommendationsTableView registerNib:nib forCellReuseIdentifier: reco recommendationCellIdentifier]; self.recommendationsTableView.scrollEnabled = YES; } -(void)executeRecSearch{ @try{ [AJAXUtils getAsyncJsonWithUrl:(NSURL *)[NSURL URLWithString:[NSString stringWithFormat:someUrl]] callback:^(NSDictionary *returnjson){ if(returnjson != nil){ self.recommendations = returnjson[@"Node"][@"Recommendations"][@"Components"]; NSLog(@"COUNT: %d", [self.recommendations count]); [self performSelectorOnMainThread:@selector(renderRecommendations) […]

属性名前面的下划线,在setter中

我写了一个setter方法 – – (void)setMyProp:(MyProp *)myProp{ _myProp = myProp; } 在属性名称工作之前,下划线如何放置? 我知道这个问题已经被问到,但他们是关于用户设置属性名称为_myProp,一些约定。 我不合成或更改属性名称。 这个下划线是如何工作的?