我一直得到'无法同时满足约束'的例外(Xcode 5,iOS 7,设备和模拟器),其中列表中的一个约束是这样的:
"<NSLayoutConstraint:0x165b23d0 'UIView-Encapsulated-Layout-Width'
H:[StoryPlayerCell:0x165affc0(0)]>"
Run Code Online (Sandbox Code Playgroud)
我自己没有设置这个约束.它也不是NSAutoresizingMaskLayoutConstraint.但是它来自哪里?我怎么能摆脱它呢?
我不知道.我'UIView-Encapsulated-Layout-Width'在Apple的文档中找不到任何相关内容.即便是谷歌搜索也没有任何回报.
有什么建议?
PS:我在UICollectionView一个自定义子类中使用这个单元格UICollectionViewFlowLayout.也许这'Encapsulated-Layout'部分与此有关?
ios autolayout uicollectionview nslayoutconstraint uicollectionviewlayout
当用户在地图上放大或滚动时,我想连续更新我的UI,根据MKMapView.(不仅在滚动结束后,工作正常.)
我尝试了委托方法mapView:regionWillChangeAnimated:根据文档,"只要当前显示的地图区域发生变化就会调用.在滚动期间,可以多次调用此方法来报告地图位置的更新." http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
[self updateUIAcordingToMapViewRegionChange];
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这不起作用,因为文档似乎没有说实话.该方法仅在区域变化的最开始时调用一次.在滚动期间,当手指向下并四处移动时,永远不会再次调用该方法.
我能找到的关于这个问题的唯一帖子是由macrumors成员namanhams:http://forums.macrumors.com/showthread.php?t = 1225172 但是没有人想出任何想法......
作为一种解决方法,我尝试在regionWillChange中设置一个计时器(并在regionDidChange中使其无效):
- (void)handleRegionChange:(NSTimer*)timer
{
[self updateUIAcordingToMapViewRegionChange];
}
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(handleRegionChange:)
userInfo:nil
repeats:YES];
}
Run Code Online (Sandbox Code Playgroud)
但这也行不通.来自计时器的所有方法调用都在滚动结束后立即执行.似乎滚动mapView阻止主线程或其他东西......
我也在stackoverflow上阅读了这篇文章,但遗憾的是并没有完全理解它: 监视MKMapView重绘事件 所以如果我的问题的解决方案确实存在于那个SO线程中,请告诉我,我试着深入研究它的细节.
我仍然希望我只是太愚蠢或太盲目无法找到正确的委托方法,并且非常感谢处理MKMapView区域跟踪的任何提示,变通方法和最佳实践.
谢谢!
为了在我的swift单元测试中对我的主应用程序目标的公共类进行单元测试,我必须在我的测试中导入我的主应用程序模块,如下所示:
#import MyAppModuleName
这工作得很好,直到我将部署目标从7.0更改为8.4.
现在构建和运行我的应用程序仍然完美,但运行单元测试停止工作.编译器抱怨上面的import语句:Swift Compiler Error: Module file's minimum deployment target is iOS8.4 v8.4
我不知道为什么.我忘记在其他地方更改部署目标了吗?
我的工作区(Xcode 6.4.)包含我自己的项目和一个Pods项目(由cocoapods自动创建).我在我的应用程序和测试中使用了Swift和Objective-C.
这是我更详细的做法:
1)为我的项目,我的主要目标,以及Pods我工作区中的项目以及所有pod目标,将部署目标从7.0更改为8.4 .




2)清理构建文件夹(Shift + Alt + Cmd + K)并重新启动Xcode.
3)Cmd + U - >错误
将主应用程序的部署目标更改回7.0时,一切正常.
这个问题来自哪里?
从Swift 2.2转换为3.0后,我的Array扩展不再编译,因为它包含对全局标准库函数的调用min<T>(T,T)并显示编译器错误extra argument in call.
这是重现错误的简单方法:
extension Array {
func smallestInt(first: Int, second: Int) -> Int {
return min(first, second) // compiler error: "Extra argument in call"
}
}
Run Code Online (Sandbox Code Playgroud)
将相同的函数添加到扩展名时Dictionary,我得到相同的错误,而完全相同的代码在其他类型的扩展中编译得很好(例如String或AudioBuffer):
看着的文件Array和Dictionary,我发现有关于实例方法Sequence命名public func min() -> Element?和public func min(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element?.虽然两者String并AudioBuffer没有任何形式的min(...)功能.
这可能是我无法调用全局函数的原因吗?编译器无法区分全局func min<T>(T,T),self.min(...)尽管它们具有完全不同的签名? …
我通常懒惰地在他们的getter方法中实例化我的@property对象,如下所示:
@interface MyGenericClass : UIViewController
@property(nonatomic, readonly) UIImageView *infoImageView
// ...
@implementation GenericClass
- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"PlaceholderInfoImage"]];
}
return _infoImageView;
}
Run Code Online (Sandbox Code Playgroud)
但是当子类化时,我经常想要覆盖一些@properties以使其更具子类.所以我想改变实例化并执行以下操作:
@interface MySpecificSubclass : MyGenericClass
//...
@implementation MySpecificSubclass
- (UIImageView *)infoImageView
{
if (!_infoImageView) {
_infoImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"SpecialInfoImage"]];
}
return _infoImageView;
}
Run Code Online (Sandbox Code Playgroud)
但那是不可能的,因为子类无法访问_infoImageView iVar.
我正在努力做坏事吗?或者有一个共同的解决方案/最佳实践吗?我看到的唯一解决方案是让iVar公开,这感觉违反了封装原则......
感觉这是一个非常基本的问题,那里必须有数百万的答案,但是在搜索了几个小时之后,我发现的一切都是Objective-C:当覆盖超类getter并尝试访问ivar时编译错误 ,但是它没有解决方案.
overriding lazy-loading properties objective-c lazy-initialization
我试图asset从AVAssetTrack对象中获取属性,但nil有时会这样。看来这个问题是我使用后才出现的Dispatch.main.async。
根据文档,有必要使用loadValuesAsynchronously(forKeys:, completion:)以避免阻塞主线程,并在加载完成后返回主线程。
let asset = AVURLAsset(url: videoInAppBundleURL)
let track = asset.tracks(withMediaType: .video).first!
assert(track.asset != nil) // passes
track.loadValuesAsynchronously(forKeys: [#keyPath(AVAssetTrack.asset)]) {
assert(track.asset != nil) // passes
DispatchQueue.main.async {
assert(track.asset != nil) // FAILS
// [...]
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的是:
这是一个工作演示项目。
我还想知道:为什么AVAssetTrack的asset属性是可选的?(所有!!其他属性都是非可选的)
注意:在阅读马特的有用评论和进一步调查后,这个问题已被编辑。
ios ×4
swift ×2
arrays ×1
asynchronous ×1
autolayout ×1
avasset ×1
avfoundation ×1
lazy-loading ×1
mapkit ×1
mkmapview ×1
objective-c ×1
overriding ×1
properties ×1
swift3 ×1
unit-testing ×1
xcode ×1