我正在使用UIActivityViewController将我的应用程序中的信息共享到Twitter和FB,这些信息已在"设置"中正确配置.代码是最简单的:
- (IBAction)share {
NSString *postText = @"some text";
UIImage *postImage = [UIImage imageNamed:@"myImage"];
NSURL *postURL = [NSURL URLWithString:@"myUrl"];
NSArray *activityItems = @[postText, postImage, postURL];
UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
activityController.excludedActivityTypes =
@[
UIActivityTypePrint,
UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeCopyToPasteboard,
UIActivityTypeMail,
UIActivityTypeMessage,
UIActivityTypePostToWeibo,
];
[activityController setCompletionHandler:^(NSString *activityType, BOOL completed) {
if ([activityType isEqualToString:UIActivityTypePostToFacebook]) {
if (completed) [self doSomethingForFB];
} else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) {
if (completed) [self doSomethingForTwitter];
}
}];
[self presentViewController:activityController animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
这段代码就像模拟器上的魅力(iphone和ipad,ios7和ios6),但在我的设备(带iOS7的iPad)上,当ActivityViewController出现时,Twitter和FB就在那里,因为标签是可见的,但是他们的图标不见了.
我有一个obj-c项目,我成功地添加了一个新的Swift类A,它被一些现有的obj-c类B使用 - 使用自动生成的"MyProject-Swift.h"标头按预期工作.
我还成功添加了一个新的Swift类C,它使用了一些现有的obj-c类D - 桥接头的使用也按预期工作.
但是,假设我想从我的Swift类C引用现有的obj-c类B(后者又引用新的Swift类A).为此,我需要将"Bh"导入桥接头.但是,如果我这样做,我在B类中出现错误:"找不到'MyProject-Swift.h'文件"(即,不再生成文件).
我做错了什么或者这是Swift和Objective-C之间的一种互动是不允许的?看起来有一种编译器无法解决的循环引用.
---编辑---
我会尝试通过添加一些代码来使问题更清晰.
- 序言 -
我在一个obj-c项目中添加了一个新的Swift类:
// SwiftClassA.swift
import Foundation
@objc class SwiftClassA : NSObject {
var myProperty = 0
}
Run Code Online (Sandbox Code Playgroud)
代码编译正确,并在自动生成的"MyProject-Swift.h"标题中转换为obj-c存根,如下所示:
// MyProject-Swift.h
...
SWIFT_CLASS("_TtC7MyProject11SwiftClassA")
@interface SwiftClassA : NSObject
@property (nonatomic) NSInteger myProperty;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
Run Code Online (Sandbox Code Playgroud)
现在,一个obj-c类使用SwiftClassA:
// ObjCClass.h
#import <Foundation/Foundation.h>
#import <MyProject-Swift.h>
@interface ObjCClass : NSObject
@property (nonatomic, strong) SwiftClassA *aProperty;
@property (nonatomic) int *aNumber;
@end
Run Code Online (Sandbox Code Playgroud)
这也可以无缝地工作.
- 问题 -
我现在可以创建一个新的Swift类,它引用使用Swift类SwiftClassA的obj-c类(ObjCClass)吗?
这是我不能做的.
如果我添加新的Swift类:
// SwiftClassB.swift
import Foundation
@objc class …Run Code Online (Sandbox Code Playgroud) 我正在开发一个有很多成就的应用程序.出于可读性原因,在游戏中心中显示成就的顺序有些相关.随着应用程序的新版本的推出,我正在添加新的成就.现在,改变成就顺序的标准方法是在iTunes Connect界面中拖动它们,正如这个答案所暗示的那样.
然而,正如另一个问题所指出的那样,这并不总是有效,如果你尝试得到一条消息"Failed to update sort order. Please try again."(我从未成功过).作为关于"通用计算硬件和软件"的问题,上述问题被视为偏离主题.
那么,让我从编程的角度来重新解释这个问题:
我正在开发一个有两个游戏中心玩家的回合制游戏,我想允许自动匹配.
我已经读到了,为了实际发送给玩家的邀请,邀请玩家必须结束他/她的回合.这意味着调用此方法:
- (void)endTurnWithNextParticipants:(NSArray *)nextParticipants turnTimeout:(NSTimeInterval)timeout matchData:(NSData *)matchData completionHandler:(void (^)(NSError *error))completionHandler
Run Code Online (Sandbox Code Playgroud)
现在,我不明白的是"nextParticipants"数组的含义,以防匹配在自动匹配模式下启动,正如我所读,通过将参与者设置为nil来完成,例如:
GKMatchRequest *request = [[GKMatchRequest alloc] init];
request.minPlayers = 2;
request.maxPlayers = 2;
request.playersToInvite = nil;
request.inviteMessage = @"Let’s play";
[GKTurnBasedMatch findMatchForRequest: request
withCompletionHandler: ^(GKTurnBasedMatch *match,
NSError *error) {
NSLog(@"%@", match);
}];
Run Code Online (Sandbox Code Playgroud)
如果阵列为零,我不知道谁将参加比赛,我怎么可能将转牌传给下一位球员?如果我在nextParticipants参数中使用nil,当然我得到一个'nextParticipants的无效列表'错误.
Apple的文档似乎对此保持沉默.
所以,我也不明白的是自动匹配实际上是如何工作的.它会无条件地匹配任何已经开始与自动比赛进行新比赛的两名球员吗?我不能以某种方式选择我想要自动匹配的匹配项吗?(假设,例如,游戏允许几个难度级别,并且我不希望与在较低级别玩的人自动匹配).
编辑(根据xcodegirl的评论):
为了解决这一点,只需通过在请求的playerGroup属性中添加编码所需匹配类型的内容来扩展上述代码即可:
request.playerGroup = [Utils myEncodingAsNSUIntegerOfGameTypeGivenSomeParameters:...];
Run Code Online (Sandbox Code Playgroud)
但不好的是,playerGroup似乎不是GKTurnBasedMatch的可用属性.因此,如果您列出了您的匹配项,包括待处理的自动匹配项,并希望显示有关您要玩的游戏类型的信息,则应以其他方式存储此信息.
我正在定义一个协议(用于信息隐藏目的),它具有"下标"功能,同时具有getter和setter.然后我定义了一个实现该协议的类.
问题的简短版本:如果我在类的对象上使用下标(作为左值,从而使用setter),一切都按预期工作.如果我在刚刚声明协议类型的对象上执行此操作,则会出现"无法分配此表达式的结果"错误.
长版.我有一个Int的董事会.板是2D矩阵.我通过BoardType协议公开了Board类型.
protocol BoardType {
var width: Int { get }
var height: Int { get }
subscript(x: Int, y: Int) -> Int { get set }
}
class Board: BoardType {
let width, height: Int
var matrix: Array2D<Int>
init(width: Int, height: Int) {
self.width = width
self.height = height
matrix = Array2D<Int>(cols: width, rows: height, defaultValue: 0)
}
subscript(x: Int, y: Int) -> Int {
get {
return matrix[x, y]
}
set {
matrix[x, y] = newValue
} …Run Code Online (Sandbox Code Playgroud) 考虑以下代码,它将手势识别器添加到视图中。
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
let gesture = UITapGestureRecognizer(target: self, action: #selector(handleGesture(gesture:)))
let test1 = self
@objc func handleGesture(gesture: UITapGestureRecognizer) {
// some code
print("hello")
}
override func viewDidLoad() {
let test2 = self
super.viewDidLoad()
imageView.addGestureRecognizer(gesture)
}
}
Run Code Online (Sandbox Code Playgroud)
根据这个问题,上面的代码不起作用,因为我试图self在未完全初始化时使用(在手势识别器的初始化程序中),这是因为 Swift 的两阶段初始化。
我对简单的修复方法不感兴趣,但这会引发几个问题:
1)为什么编译器允许我们在self这里使用如果self还没有准备好使用?如果我试图self过早使用,我不应该得到编译器错误吗?
2)我们不能self在XCode中用alt+click直接检查的类型。但是,我们可以检查我的临时变量的类型test1和test2. 正如预期的那样,Whiletest2的类型是ViewController,test1的类型是(ViewController) -> () -> ViewController(即,一个接受 aViewController …
ios ×3
swift ×3
game-center ×2
achievements ×1
facebook ×1
gamekit ×1
objective-c ×1
protocols ×1
self ×1
subscript ×1
twitter ×1