小编Sen*_*ful的帖子

为在Objective-C中实现特定协议的类创建类别?

简短的问题描述

我可以使用类别扩展UIView,但是它只适用于实现特定协议(WritableView)的子类吗?

即我可以做以下的事情吗?

@interface UIView<WritableView> (foo) // SYNTAX ERROR
- (void)setTextToDomainOfUrl:(NSString *)text;
- (void)setTextToIntegerValue:(NSInteger)value;
- (void)setCapitalizedText:(NSString *)text;
@end
@implementation UIView<WritableView> (foo)
// implementation of 3 above methods would go here
@end
Run Code Online (Sandbox Code Playgroud)

详细的问题描述

想象一下,我想将以下类别函数添加到任何实例UILabel:

[label setTextToDomainOfUrl:@"http://google.com"];
Run Code Online (Sandbox Code Playgroud)

这只是设置UILabel的text属性google.com.

同样地,我希望能够在其他几个类上调用此函数:

[button setTextToDomainOfUrl:@"http://apple.com"]; // same as: [button setTitle:@"apple.com" forState:UIControlStateNormal];
[textField setTextToDomainOfUrl:@"http://example.com"]; // same as: textField.text = @"example.com"
[tableViewCell setTextToDomainOfUrl:@"http://stackoverflow.com"]; // same as: tableViewCell.textLabel.text = @"stackoverflow.com"
Run Code Online (Sandbox Code Playgroud)

假设到目前为止我对我的设计非常满意,并且我希望为所有4个类增加2个方法:

[label setTextToIntegerValue:5] // same as: label.text = [NSString stringWithFormat:@"%d", 5]; …
Run Code Online (Sandbox Code Playgroud)

objective-c objective-c-category objective-c-protocol

7
推荐指数
1
解决办法
2157
查看次数

当尝试从Xcode控制台打印内容时,"执行被中断,原因:断点"

我暂停了我的应用程序并尝试将某些内容打印到控制台.(例如po foo()).这样做之后,我收到以下消息:

错误:执行被中断,原因:断点2.1.
该进程已在执行前返回到该状态.

但是,该功能没有断点.为什么它会向我显示此错误而不执行该功能?

这是在Xcode 4.6上.

xcode llvm

7
推荐指数
1
解决办法
9922
查看次数

在函数中使用@lazy属性会导致生成错误

我试图将类范围限制在函数内.这似乎有效:

func foo() {
    class MyClass {
        var s = ""
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在foo()函数中创建MyClass的实例.

但是,当我尝试将@lazy说明符添加到属性时......

func foo() {
    class MyClass {
        @lazy var s = ""
    }
}
Run Code Online (Sandbox Code Playgroud)

...我收到以下构建错误:

  • 全球是外部的,但没有外部或弱的联系!
  • 函数声明的链接类型无效
  • LLVM错误:找到损坏的模块,编译中止!

注意:如果我将类移出函数的作用域,代码将编译:

class MyClass {
    @lazy var s = ""
}
Run Code Online (Sandbox Code Playgroud)

为什么会失败,这个错误应该如何解决?如果无法解决,是否有另一种方法在函数内部使用@lazy属性?

swift

7
推荐指数
1
解决办法
693
查看次数

你能从命令行运行一个特定的Xcuitest吗?

使用iOS 9.0,Xcode GM和新的Xcuitesting框架.如何从命令行运行特定测试,而不必单击ide中的play?我知道有一个快捷方式来运行所有测试,但我想运行一个测试.

谢谢!

testing xcode ios xcode-ui-testing

7
推荐指数
1
解决办法
3592
查看次数

处理UIKeyboardWillShowNotification以便在按下视图控制器时键盘已经启动?

通常,如果您将UITextField设置为第一响应者,viewDidLoad或者viewWillAppear当视图控制器被推入导航堆栈时,您将获得一个动画,其中视图控制器从右侧滑入,键盘已经向上(即没有双动画) :

在此输入图像描述
理想的动画(250毫秒)

但是,当我使用自动布局并根据键盘大小控制视图的布局时,会导致奇怪的动画.在这种情况下,我的按钮有一个约束到superview的底部,我在键盘通知事件中更新其常量属性.

在此输入图像描述
越野车动画(250毫秒)

(注意按钮,占位符和标签在推送期间如何向上动画.还要注意光标如何从占位符文本下方开始并向上浮动直到它到达占位符.)

根本问题似乎是,当通知被触发时,它已经在动画块(动画导航控制器的动画块)中,然后在现有动画块中触发另一个动画块(即,self.view.layoutIfNeeded()以便自动布局更改动画).

当然我可以在viewDidAppear中调用becomeFirstResponder ,但后来我得到了两个动画.我想利用键盘已启动的行为,因此界面看起来更具响应性(理想情况下保持接近250毫秒).

在此输入图像描述
双动画(600毫秒)

我如何处理UIKeyboardWillShowNotification,以便当用户点击UITextField并且在推动视图控制器时使用我上面的理想动画时它将同时工作?


理想解决方案

  • Apple会在通知字典中提供另一个值,例如shouldAnimate,它会告诉您在处理通知时是否应该使用UIAnimation块.例如:在此推送的情况下,它会发送false,但如果用户只是点击文本字段,它将发送true.

Hacky的解决方法:

  • 不要立即在viewDidLoad中设置becomeFirstReponder,而是以任意延迟调用它.这将导致不合需要的双重动画:首先视图控制器将从右侧滑入,然后键盘将出现.(有关此示例,请参阅上面的"双动画"动画.)
  • 推断如果你是在一个动画块通过查看通知的用户信息字典的关键,比如UIKeyboardAnimationDurationUserInfoKey这是0.35一个推动过程,并且0.25当用户点击一个的UITextField.如果定制动画,Apple更改动画等,这很容易破坏.
  • viewWillAppear(preventAnimationBlock = true)和viewDidAppear(preventAnimationBlock = false)中设置一个标志.这似乎是最安全的方法,并产生我想要的精确动画.但是,维持状态是不可取的.

解决方案不起作用:

  • viewDidLoad中的布局.以现在的眼光最后还是没负载,通话setNeedsLayoutlayoutIfNeeded,而该解决方案在过去的工作,它不与上面的按钮例子工作.这将导致标签和文本视图无法正确设置动画,但该按钮仍将无法正确显示动画.
  • 尝试检查你是否已经处于动画块中:如果有办法知道我是否已经在动画块中,它可以解决我的问题; layoutIfNeeded在那种情况下我根本不会打电话.我尝试使用其中一种方法来解决这个问题,但没有一种方法可行.可能是因为这是Apple在内部使用的某种隐藏/魔术动画块.
  • 尝试查看视图是否在屏幕上:使用此视图的想法是视图将在屏幕外报告,因为尚未调用viewDidAppear,因此我不会将代码包装在动画块中.但是,当您尝试 …

keyboard cocoa-touch nsnotificationcenter ios autolayout

7
推荐指数
0
解决办法
747
查看次数

如何通过 Fastlane 将构建分发给外部测试人员?

我有一个执行uploadToTestFlight操作的 Fastfile :

uploadToTestflight(
  username: "foo@example.com",
  skipWaitingForBuildProcessing: false,
  distributeExternal: true)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,这成功了。但是,它实际上并没有将构建分发给任何人。当我查看 App Store Connect > My Apps > Foo App > TestFlight > iOS 上的构建时,它在构建名称附近显示“已批准”,这意味着它已经通过了审核过程。

但是,当我单击构建时,我注意到它被发布到的唯一组或用户是App Store Connect Users,这意味着它实际上并未从外部发布。

我有一个名为的组Foo Group,每当我运行 fastlane 时,我都想将其发布到该组。我怎么做?

我尝试通过Pilot文档解决但它没有外部分发的示例。

fastlane fastlane-pilot app-store-connect

7
推荐指数
2
解决办法
2413
查看次数

如何使用Capybara/Selenium在Chrome上下载多个文件?

我正在使用Capybara与Chrome和Selenium.当我尝试单击导致自动下载的链接时,将正确下载该文件.如果我再次尝试执行此操作,Chrome会显示消息:"此网站正在尝试下载多个文件.您要允许此操作吗?"

在此输入图像描述

我正在寻找一个可用于禁用此消息的标志,但找不到任何内容.有什么办法可以绕过这条消息并允许多次下载而无需借助页面刷新?(例如,我是否可以通过编程方式单击"允许"按钮?)

google-chrome capybara selenium-webdriver

6
推荐指数
1
解决办法
2047
查看次数

Xcode 7中的UITests找到错误的"下一步"按钮

我有一个如下所示的测试:

func testNextButtonDisabled() {
  let app = XCUIApplication()
  XCTAssertFalse(app.buttons["Next"].enabled)
}
Run Code Online (Sandbox Code Playgroud)

此测试失败,因为除了我自己创建的"下一步"按钮外,键盘返回按钮标有"下一步".此测试失败并显示错误:

UI测试失败 - 找到多个匹配项

如何区分我自己的"下一步"按钮和键盘"下一步"按钮?

xcode ui-testing xctest xcode-ui-testing

6
推荐指数
1
解决办法
2838
查看次数

Xcode 7 UITesting OS X上的菜单栏应用程序

我正在尝试将XCode 7 UITesting用于像Macbox X上的Dropbox,1Password这样的菜单应用程序.这是否可以使用Xcode 7提供的最新功能自动进行UI测试?我知道UI测试适用于iOS应用程序,但是演示从未显示它是否适用于视频中的OS应用程序.如果它适用于OS X应用程序,但它是否适用于菜单栏应用程序?请指导我解决这个问题.

macos xcode-ui-testing

6
推荐指数
1
解决办法
515
查看次数

如何在运行Xcode UI测试时禁用自动完成?

作为我的UI测试的一部分,我正在生成一个随机字符串作为我的对象的标题.问题是,当通过键盘(使用XCUIElement.typeText())输入此标题时,iOS有时会接受自动建议的值.

例如,我可能希望它键入一个自动生成的"calg"字符串,但自动更正将改为选择"calf".当我稍后尝试使用断言查找此值时,它不存在并且未正确地失败.

有没有办法告诉UI测试他们不应该使用自动更正,或者是否有我可以使用的变通方法?

xcode ios xcode-ui-testing

6
推荐指数
2
解决办法
1517
查看次数