我用Xcode6 beta6打开了一个现有的iOS项目,Xcode为Storyboard和Xib文件列出了以下警告:
自动首选最大布局宽度在8.0之前的iOS版本上不可用
我尝试通过将宽度设置为显式来解决警告,如下所示:
然而,这并未解决警告.他们怎么能被删除?
在Swift中,我可以通过如下声明来明确设置变量的类型:
var object: TYPE_NAME
Run Code Online (Sandbox Code Playgroud)
如果我们想更进一步并声明一个符合多个协议的变量,我们可以使用protocol
声明:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
Run Code Online (Sandbox Code Playgroud)
如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?Objective-C等价物如下所示:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
Run Code Online (Sandbox Code Playgroud)
在Swift中,我希望它看起来像这样:
var object: TYPE_NAME,ProtocolOne//etc
Run Code Online (Sandbox Code Playgroud)
这使我们能够灵活地处理基类型的实现以及协议中定义的添加接口.
还有另一种我可能会失踪的更明显的方式吗?
举个例子,假设我有一个UITableViewCell
负责返回符合协议的单元的工厂.我们可以轻松设置一个返回符合协议的单元格的泛型函数:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
Run Code Online (Sandbox Code Playgroud)
后来我想在利用类型和协议的同时将这些单元格出列
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
Run Code Online (Sandbox Code Playgroud)
这会返回错误,因为表视图单元格不符合协议...
我希望能够指定单元格是否UITableViewCell
符合MyProtocol
变量声明?
如果您熟悉工厂模式,那么在能够返回实现特定接口的特定类的对象的上下文中这将是有意义的.
就像在我的例子中一样,有时我们喜欢定义在应用于特定对象时有意义的接口.我的表格视图单元格的例子就是这样一个理由.
虽然提供的类型并不完全符合上面提到的接口,但是工厂返回的对象也是如此,因此我希望能够灵活地与基类类型和声明的协议接口进行交互
我正在尝试将一个版本上传到Fabric,我发现错误如下.我正在使用XCode 6.3(最近更新).
我该怎么做才能解决上述错误并继续通过Fabric桌面工具上传发布?
有没有其他方法将二进制文件上传到结构?
UITableViewCell反映了两种不同的状态:突出显示和选中.
对我来说,它们听起来完全相同,究竟是什么区别呢?
考虑以下控制器层次结构:
UINavigationController
UIViewController
UITableViewController
存在UIViewController
影响布局.没有它,它UITableViewController
占据了整个范围UINavigationController
:
但是,如果我UIViewController
在UINavigationController
和之间添加一个香草,则UITableViewController
在顶部UIViewController
和顶部之间出现一个20px的间隙UITableViewController
:
即使我将代码减少到最简单的事情,我仍然会观察到这种行为.考虑这个应用程序委托代码:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
window = new UIWindow(UIScreen.MainScreen.Bounds);
var tableView = new UITableViewController();
var intermediateView = new UIViewController();
var navigation = new UINavigationController(intermediateView);
navigation.View.BackgroundColor = UIColor.Red;
intermediateView.View.BackgroundColor = UIColor.Green;
tableView.View.BackgroundColor = UIColor.Blue;
intermediateView.AddChildViewController(tableView);
intermediateView.View.AddSubview(tableView.View);
tableView.DidMoveToParentViewController(intermediateView);
window.RootViewController = navigation;
window.MakeKeyAndVisible();
return true;
}
Run Code Online (Sandbox Code Playgroud)
上面仍然显示了顶部UIView
和顶部之间的20px间隙UITableView
.
我知道有些东西 …
我不小心在CloudKit中创建了一个新的容器,当我打开仪表板时,它真的很烦人.有什么建议删除吗?在developer.apple.com上,我没有看到容器的删除按钮.
在我的设计示例中,我有以下单一视图:
如您所见,它包含一些简单的约束:
我想要实现的是让这个红色/粉红色的视图从顶部"进入".传统上,在一个无约束的世界中,我只是修改内部的框架UIView.animateWithDuration
,但是我不确定我是如何在约束世界中做类似的.
为了重申我的问题,如何让我的视图从场景开始并使从顶部飞入的视图动画?
我已经考虑过制作垂直中心约束(并随后调用layoutIfNeeded
),但它没有达到预期的效果.
谢谢你的帮助.
关于iOS自动续订订阅,我有以下问题
a)自动续订订阅是否真的在沙箱环境中自动续订?问题似乎是订阅不会自动更新,尽管文档说即使在沙盒环境中它也应该发生6次.
b)我们是否需要调用restoreCompletedTransactions来获取自动扩展订阅的新收据,或者是-paymentQueue:updatedTransactions:iOS自动调用的方法?(我猜它会自动调用'启动'和'旋转出背景'不确定)
c)您如何在多个设备上处理相同的订阅?这可以通过restoreCompletedTransactions来处理,但是调用它会提示用户输入密码,因此每次启动应用程序时调用它都不是很方便.
我正在寻找一个完全可行的解决方案,一个适用于:
目前破碎的代码:
NSString lastModifiedString = @"Mon, 06 Jun 2011 12:47:05 GMT";
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
df.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSDate date = [df dateFromString:lastModifiedString];
Run Code Online (Sandbox Code Playgroud)
我假设Last-Modified
应该使用与HTTP规范中的其他日期字段相同的格式,这意味着使用RFC-1123/RFC-822
资源:
//设置通知
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(dataChanged:)
name:NSManagedObjectContextDidSaveNotification
object:context];
Run Code Online (Sandbox Code Playgroud)
//后来
- (void)dataChanged:(NSNotification *)notification{
NSDictionary *info = notification.userInfo;
NSSet *insertedObjects = [info objectForKey:NSInsertedObjectsKey];
NSSet *deletedObjects = [info objectForKey:NSDeletedObjectsKey];
NSSet *updatedObjects = [info objectForKey:NSUpdatedObjectsKey];
Run Code Online (Sandbox Code Playgroud)
无论如何要从updatedObjects确定哪些字段实际更改了?
谢谢,迈克尔