我可以使用类别扩展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) 我暂停了我的应用程序并尝试将某些内容打印到控制台.(例如po foo()).这样做之后,我收到以下消息:
错误:执行被中断,原因:断点2.1.
该进程已在执行前返回到该状态.
但是,该功能没有断点.为什么它会向我显示此错误而不执行该功能?
这是在Xcode 4.6上.
我试图将类范围限制在函数内.这似乎有效:
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属性?
使用iOS 9.0,Xcode GM和新的Xcuitesting框架.如何从命令行运行特定测试,而不必单击ide中的play?我知道有一个快捷方式来运行所有测试,但我想运行一个测试.
谢谢!
通常,如果您将UITextField设置为第一响应者,viewDidLoad或者viewWillAppear当视图控制器被推入导航堆栈时,您将获得一个动画,其中视图控制器从右侧滑入,键盘已经向上(即没有双动画) :
但是,当我使用自动布局并根据键盘大小控制视图的布局时,会导致奇怪的动画.在这种情况下,我的按钮有一个约束到superview的底部,我在键盘通知事件中更新其常量属性.
(注意按钮,占位符和标签在推送期间如何向上动画.还要注意光标如何从占位符文本下方开始并向上浮动直到它到达占位符.)
根本问题似乎是,当通知被触发时,它已经在动画块(动画导航控制器的动画块)中,然后在现有动画块中触发另一个动画块(即,self.view.layoutIfNeeded()以便自动布局更改动画).
当然我可以在viewDidAppear中调用becomeFirstResponder ,但后来我得到了两个动画.我想利用键盘已启动的行为,因此界面看起来更具响应性(理想情况下保持接近250毫秒).
我如何处理UIKeyboardWillShowNotification,以便当用户点击UITextField并且在推动视图控制器时使用我上面的理想动画时它将同时工作?
UIKeyboardAnimationDurationUserInfoKey这是0.35一个推动过程,并且0.25当用户点击一个的UITextField.如果定制动画,Apple更改动画等,这很容易破坏.viewWillAppear(preventAnimationBlock = true)和viewDidAppear(preventAnimationBlock = false)中设置一个标志.这似乎是最安全的方法,并产生我想要的精确动画.但是,维持状态是不可取的.setNeedsLayout和layoutIfNeeded,而该解决方案在过去的工作,它不与上面的按钮例子工作.这将导致标签和文本视图无法正确设置动画,但该按钮仍将无法正确显示动画.layoutIfNeeded在那种情况下我根本不会打电话.我尝试使用其中一种方法来解决这个问题,但没有一种方法可行.可能是因为这是Apple在内部使用的某种隐藏/魔术动画块.我有一个执行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 时,我都想将其发布到该组。我怎么做?
我有一个如下所示的测试:
func testNextButtonDisabled() {
let app = XCUIApplication()
XCTAssertFalse(app.buttons["Next"].enabled)
}
Run Code Online (Sandbox Code Playgroud)
此测试失败,因为除了我自己创建的"下一步"按钮外,键盘返回按钮标有"下一步".此测试失败并显示错误:
UI测试失败 - 找到多个匹配项
如何区分我自己的"下一步"按钮和键盘"下一步"按钮?
我正在尝试将XCode 7 UITesting用于像Macbox X上的Dropbox,1Password这样的菜单应用程序.这是否可以使用Xcode 7提供的最新功能自动进行UI测试?我知道UI测试适用于iOS应用程序,但是演示从未显示它是否适用于视频中的OS应用程序.如果它适用于OS X应用程序,但它是否适用于菜单栏应用程序?请指导我解决这个问题.
作为我的UI测试的一部分,我正在生成一个随机字符串作为我的对象的标题.问题是,当通过键盘(使用XCUIElement.typeText())输入此标题时,iOS有时会接受自动建议的值.
例如,我可能希望它键入一个自动生成的"calg"字符串,但自动更正将改为选择"calf".当我稍后尝试使用断言查找此值时,它不存在并且未正确地失败.
有没有办法告诉UI测试他们不应该使用自动更正,或者是否有我可以使用的变通方法?
xcode ×4
ios ×3
autolayout ×1
capybara ×1
cocoa-touch ×1
fastlane ×1
keyboard ×1
llvm ×1
macos ×1
objective-c ×1
swift ×1
testing ×1
ui-testing ×1
xctest ×1