是否有人设法在Swift项目中使用Google Drive Api(对象C)
https://developers.google.com/drive/ios/quickstart
我尝试了多种方法,但是无法编译
我最接近的是在下面的链接中使用Rob的方法,并将#import“
GTLDrive.h”添加到BridgingHeader中。这使我可以创建GTLDrive,但不能创建Auth,因为我无法让Xcode注意No ARC标志。
并添加带有bridging-header.h文件
#import "GTLDrive.h"
#import "GTMOAuth2ViewControllerTouch.h"
为了节省时间,我将我的Objective-C包含在Google快速入门中的示例的Swift Translation中
iOS版Google云端硬盘快速入门
import UIKit
import MobileCoreServices
class ViewController: UIViewController , UINavigationControllerDelegate ,UIImagePickerControllerDelegate {
var window: UIWindow?
let driveService : GTLServiceDrive = GTLServiceDrive()
let kKeychainItemName : NSString = "Google Drive Quickstart"
let kClientID : NSString = "Your Client ID"
let kClientSecret : NSString = "Your Secret"
func showWaitIndicator(title:String) -> UIAlertView {
// println("showWaitIndicator \(title)")
var progressAlert = UIAlertView()
progressAlert.title = title
progressAlert.message = "Please Wait...."
progressAlert.show()
let activityView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.White)
activityView.center = CGPointMake(progressAlert.bounds.size.width / 2, progressAlert.bounds.size.height - 45)
progressAlert.addSubview(activityView)
activityView.hidesWhenStopped = true
activityView.startAnimating()
return progressAlert
}
override func viewDidLoad() {
super.viewDidLoad()
self.driveService.authorizer = GTMOAuth2ViewControllerTouch.authForGoogleFromKeychainForName(kKeychainItemName,
clientID: kClientID,
clientSecret: kClientSecret)
}
override func viewDidAppear(animated: Bool) {
self.showCamera()
}
func showCamera() {
var cameraUI = UIImagePickerController()
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
cameraUI.sourceType = UIImagePickerControllerSourceType.Camera
} else {
cameraUI.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
self.showAlert("Error", message: "Ipad Simulator not supported")
return
}
}
cameraUI.mediaTypes = [kUTTypeImage as String]
cameraUI.allowsEditing = true
cameraUI.delegate = self
self.presentModalViewController(cameraUI, animated: true)
println("Show Camera \(self.isAuthorized())")
if (!self.isAuthorized())
{
// Not yet authorized, request authorization and push the login UI onto the navigation stack.
cameraUI.pushViewController(self.createAuthController(), animated:true);
}
}
// Handle selection of an image
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info:NSDictionary) {
println("imagePickerController didFinishPickingMediaWithInfo")
let image = info.valueForKey(UIImagePickerControllerOriginalImage) as UIImage
self.dismissModalViewControllerAnimated(true)
self.uploadPhoto(image)
}
// Handle cancel from image picker/camera.
func imagePickerControllerDidCancel(picker: UIImagePickerController){
self.dismissModalViewControllerAnimated(true)
}
// Helper to check if user is authorized
func isAuthorized() -> Bool {
return (self.driveService.authorizer as GTMOAuth2Authentication).canAuthorize
}
// Creates the auth controller for authorizing access to Google Drive.
func createAuthController() -> GTMOAuth2ViewControllerTouch {
return GTMOAuth2ViewControllerTouch(scope: kGTLAuthScopeDriveFile,
clientID: kClientID,
clientSecret: kClientSecret,
keychainItemName: kKeychainItemName,
delegate: self,
finishedSelector: Selector("viewController:finishedWithAuth:error:"))
}
// “func join(string s1: String, toString s2: String, withJoiner joiner: String)”
// Handle completion of the authorization process, and updates the Drive service
// with the new credentials.
func viewController(viewController: GTMOAuth2ViewControllerTouch , finishedWithAuth authResult: GTMOAuth2Authentication , error:NSError ) {
if error != nil
{
self.showAlert("Authentication Error", message:error.localizedDescription)
self.driveService.authorizer = nil
} else {
println("Authentication success")
self.driveService.authorizer = authResult
}
}
// Uploads a photo to Google Drive
func uploadPhoto(image: UIImage) {
println("uploading Photo")
let dateFormat = NSDateFormatter()
dateFormat.dateFormat = "'Quickstart Uploaded File ('EEEE MMMM d, YYYY h:mm a, zzz')"
let file = GTLDriveFile.object() as GTLDriveFile
file.title = dateFormat.stringFromDate(NSDate())
file.descriptionProperty = "Uploaded from Google Drive IOS"
file.mimeType = "image/png"
let data = UIImagePNGRepresentation(image)
let uploadParameters = GTLUploadParameters(data: data, MIMEType: file.mimeType)
let query = GTLQueryDrive.queryForFilesInsertWithObject(file, uploadParameters: uploadParameters) as GTLQueryDrive
let waitIndicator = self.showWaitIndicator("Uploading To Google Drive")
// self.driveService.executeQuery(query, completionHandler: {(ticket: GTLServiceTicket, insertedFile: AnyObject, error: NSError) in {
//
//
// }
// elf.driveService.executeQuery(<#query: GTLQueryProtocol?#>, completionHandler: <#((GTLServiceTicket!, AnyObject!, NSError!) -> Void)?#>)
self.driveService.executeQuery(query, completionHandler: { (ticket, insertedFile , error) -> Void in
let myFile = insertedFile as? GTLDriveFile
waitIndicator.dismissWithClickedButtonIndex(0, animated: true)
if error == nil {
println("File ID \(myFile?.identifier)")
self.showAlert("Google Drive", message: "File Saved")
} else {
println("An Error Occurred! \(error)")
self.showAlert("Google Drive", message: "Sorry, an error occurred!")
}
})
}
func showAlert(title: String, message: String ) {
let cancel = "OK"
println("show Alert")
let alert = UIAlertView()
alert.title = title
alert.message = message
alert.addButtonWithTitle(cancel)
alert.show()
}
}
问题内容: 我有一个使用自定义方法连接到xib 的子类。 有没有办法可以在方法中初始化此单元格并仍然重用它?还是我必须使用重用标识符注册类本身? 问题答案: 惯用的NIB流程为: 使用重用标识符注册您的NIB。在Swift 3中 } 在Swift 2中: 定义您的自定义单元格类: class NameInput: UITableViewCell { } 在Interface Builder中创建一
我想将 UI 表视图与不同的自定义表视图单元一起使用。我的3个单元格是这样的: Cell1:应该有一个图像和一个标签。 Cell2:应该有两个标签。 Cell3:应该有一天选择器。 我不想为单元格编写标签代码。我如何在Swift中管理这些?我必须为每个单元格编写自己的类吗?我可以使用一个tableviewController吗?如何在不同的单元格中填充数据? 我想生成一个表视图,就像iOS设备的联
问题内容: 我正在用Swift开发iOS应用程序。 我想使用prepareForSegue函数将数据从视图发送到另一个视图。 但是,我的目标视图之前是导航控制器,因此它不起作用。 请问我该怎么做? 问题答案: 在访问目标导航控制器,然后在其顶部: 您可以从目标控制器访问其视图并传递数据。 在旧版本(现在已过时)的Swift和UIKit版本中,代码略有不同:
问题内容: 我有一个简单的问题。我曾尝试在许多博客中搜索有关此问题的信息,但所有站点都返回了如何快速运行功能,但我需要这种情况。 我的自定义函数是: 如何通过args将args传递给其他系统函数? 谢谢前进。 问题答案: 与(Objective-)C中类似,您不能将变量参数列表直接传递给另一个函数。您必须创建一个 (与C语言中的Swift等效)并调用一个带有参数的函数。 所以这可能是您要寻找的:
问题内容: 我是一名Swift新手,我正在努力使Structs具有可选属性。我已经做了很多搜索,找到了可以解决的问题,但是效率低下,所以想知道是否有更好/更易管理的方法来实现我的目标。 我想使用Structs来代表一家企业,但我事先不知道任何特定企业可能具有哪种属性组合。这似乎意味着我必须为每种可能的参数组合创建一个init()。 这是一个简化的示例(我还有更多属性): 然后,我可以像这样初始化类
问题内容: 我正在尝试在Swift中上传带有参数的图像。当我尝试此代码时,我可以获取参数,但不能获取图像 编辑2: 我认为保存的UIImage的路径存在一些问题,因为php告诉我该文件已经存在,这是因为我将其发送为空白 问题答案: 在下面的评论中,您告知我们您正在使用语法来检索文件。这意味着您要创建一个请求。该过程基本上是: 为您的请求指定边界。 指定请求的一个,以指定该请求及其边界。 创建请求正