当您指定工作空间和方案时,我对xcodebuild命令行工具会发生什么感到困惑.
我理解配置的方案如何在XCode IDE GUI中工作.构建操作列出了要构建的目标以及每个操作(分析,测试,运行,配置文件,存档),您可以选择要执行构建操作的目标.
因此,如果我在构建操作中选择了每个操作(分析,测试,运行,配置文件,存档),那么当我执行以下命令时会发生什么.
xcodebuild clean install -workspace MyWorkspace.xcworkspace -scheme MyScheme
-configuration AdHoc SYMROOT=PATH DSTROOT=PATH...
Run Code Online (Sandbox Code Playgroud)
它在主xcodeproj中搜索MyScheme.xcscheme,它在XCode中编辑方案时指定了所有这些配置.
xcodebuild从这个文件中读取了什么?它是否仅使用AdHoc配置构建配置的目标并忽略其他所有内容?
我试图在Swift中解决基于闭包的强引用循环.
在下面的代码中,对象由拥有的视图控制器保留.ProgressHUD是一个UIView由拥有的视图控制器保留的.ProgressHUD每次调用完成处理程序时都会泄露.使用新的闭包捕获功能时,将self声明为weak或unowned并不能解决内存泄漏问题.
object.setCompletionHandler { [weak self] (error) -> Void in
if(!error){
self?.tableView.reloadData()
}
self?.progressHUD?.hide(false)
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在闭包之外为self声明一个弱var,它会修复内存泄漏,如下所示:
weak var weakSelf = self
object.setCompletionHandler { (error) -> Void in
if(!error){
weakSelf?.tableView.reloadData()
}
weakSelf?.progressHUD?.hide(false)
}
Run Code Online (Sandbox Code Playgroud)
关于为什么这不适用于Swift捕获的任何想法?
我正在尝试将Cocoapods生成的静态库链接到我工作区中的多个目标.当我这样做时,我在构建时在链接阶段出现重复的符号错误.这是有意义的,因为我连接图书馆两次.
我该如何解决这个问题?我应该仅链接到主目标并包含共享目标中Pod的标头路径吗?我怎么能在Cocoapods做到这一点?我可以手动设置Pod的标题路径,但似乎打败了使用点pod install.
以下是我的工作场所设置.它由一个主项目和多个静态库组成,它们是拥有共享代码的xcode项目.我将两个静态库项目的产品链接到主目标,它们自动成为主目标的依赖项.
shared1.xcodeproj -> target shared1
shared2.xcodeproj -> target shared2
main.xcodeproj -> target main
Run Code Online (Sandbox Code Playgroud)
这是我的Podfile:
workspace 'Main.xcworkspace'
xcodeproj 'Main.xcodeproj'
xcodeproj 'Shared1.xcodeproj'
platform :ios
target :ThirdParty, :exclusive => true do
link_with ['main', 'shared1']
pod 'MKNetworkKit'
pod 'SBJSON'
...
end
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个简单的UIButton子类,它是IBDesignable.我希望能够从Interface Builder为控件的每个状态设置颜色.我知道这可以通过IBInspectable关键字实现.我在状态属性上使用KVO时遇到IB崩溃问题.IBDesignable调试器在deinit上崩溃.有谁知道我如何与KVO和IBDesignable一起工作?
@IBDesignable
class UIButtonActionButton: UIButton {
@IBInspectable var defaultColour: UIColor = UIColor.blueColor() {
didSet {
self.setNeedsDisplay()
}
}
@IBInspectable var selectedColour: UIColor = UIColor.blueColor()
@IBInspectable var disabledColour: UIColor = UIColor.grayColor()
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self._setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
self._setup()
}
private func _setup(){
self.addObserver(self, forKeyPath: "state", options: NSKeyValueObservingOptions.New, context: nil)
self.layer.cornerRadius = 5.0
self.layer.masksToBounds = true
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
self.setNeedsDisplay() …Run Code Online (Sandbox Code Playgroud) 我有一个场景,我从主窗口的rootViewController呈现模态视图控制器.当它正在加载这个模态的内容时,我正在切换到另一个加载窗口,我将其设为关键且可见.
此窗口充当加载指示器,不允许用户与应用程序交互.完成加载后,我将其切换回主窗口并使其显示为可见.当我这样做时,模态是强制关闭,应用程序不再能够呈现模态.
有趣的是,如果我在切换回主窗口时执行[UIWindow makeKeyWindow],则没有问题.[UIWindow makeKeyAndVisible]是导致问题的原因.[UIWindow makeKeyWindow]是否可以接受?
这只是iOS 5.在iOS 6中没有问题.我不支持iOS 4.有谁知道这里可能会发生什么?
我有一个表视图控制器,并且单击一个单元格可以根据单元格中的数据类型触发许多不同类型的推送段之一.在tableView:didSelectRowAtIndexPath中确定正确segue的标识符,然后使用self.performSegueWithIdentifier触发segue:
对于其中一个segues,我想将同一个视图控制器的另一个实例推送到导航堆栈.这是否可以在不必将相同类型的新视图控制器对象拖到故事板上?到目前为止,如果我从表格单元格Ctrl + Drag到视图控制器,我只能将segue连接到同一个视图控制器.这不是我想要的.
在 angular 文档中,它列出了可以实现的功能模块的类型。其中之一是服务模块。
https://angular.io/guide/module-types
在早期版本的 Angular 中,您将创建您的服务并将其列在服务 NgModule 的 providers 数组中。然后这个 NgModule 将由消费应用程序导入,其中服务将在应用程序根注入器中提供。
Injectable()
export class MyService {}
NgModule({
providers: [MyService]
})
export class MyServicesModule {}
NgModule({
imports: [MyServicesModule]
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
最新的 Angular 建议是使用 Injectable 注释,您不再需要在提供程序定义中列出它。
Injectable({ providedIn: 'root'})
export class MyService {}
Run Code Online (Sandbox Code Playgroud)
因此,创建服务模块有什么意义吗?您是否只是使用上述注释在根注入器中创建您想要提供的服务,然后直接导入服务类并相应地注入?
我目前遇到使用RxSwift Observables时执行多个网络请求的问题.我知道如果一个人创建了一个冷可观察对象并且它有多个观察者,那么observable将在每次订阅时执行它的块.
我已经尝试创建一个执行网络请求的共享订阅observable,并且会通知多个订阅者结果.以下是我的尝试.
事件顺序
当点击按钮时,服务请求被执行三次,我希望它只执行一次.有什么突出的不正确吗?
码
class ViewController {
let disposeBag = DisposeBag()
var button: UIButton!
var resultLabel: UILabel!
var activityIndicator: UIActivityIndicator!
lazy var viewModel = { // 1
return ViewModel(buttonTapped: self.button.rx.tap.asObservable())
}
override func viewDidLoad() {
super.viewDidLoad()
self.viewModel.serviceStatus.bindTo(self.resultLabel.rx_text).addDispsoableTo(disposeBag) // 4
self.viewModel.serviceExecuting.bindTo(self.activityIndicator.rx_animating).addDispsoableTo(disposeBag) // 5
}
}
class ViewModel {
public var serviceStatus: Observable<String> { // 2
let serviceStatusObseravble = self.getServiceStatusObservable()
let filtered = serviceStatusObseravble.filter { status in
return status …Run Code Online (Sandbox Code Playgroud) 我对 Angular 异步管道的理解是,它在 HTML 模板中为您订阅公开的 Observable。例如
成分
export class TestComponent {
let todos$: Observable<Array<Todo>>;
constructor(private http: HttpClient) {}
ngOnInit() {
this.todos$ = this.http.get<Array<Todos>>(...)
}
}
Run Code Online (Sandbox Code Playgroud)
模板
<div *ngFor="let todo of todos$ | async">
{{ todo }}
</div>
Run Code Online (Sandbox Code Playgroud)
我的理解是 HttpClient Observable 将发出以下成功事件:
next(value)
completed
Run Code Online (Sandbox Code Playgroud)
和错误时
error(error)
completed
Run Code Online (Sandbox Code Playgroud)
当可观察对象发出已完成事件时,订阅将关闭。
因此,如果您订阅了像 Angulars HttpClient Observable 这样的冷 observable,您如何重试该 HttpClient 请求?
异步操作符执行初始订阅,但一旦冷可观察完成就会关闭,如果你想再次执行它,如何让异步操作符重新订阅?例如,如果您想刷新数据。
ios ×4
xcode ×3
angular ×2
xcode6 ×2
async-pipe ×1
closures ×1
cocoapods ×1
ibdesignable ×1
ios5 ×1
iphone ×1
observable ×1
reactivex ×1
rx-swift ×1
rxjs ×1
swift ×1
uistoryboard ×1
uiwindow ×1
xcode4 ×1
xcodebuild ×1