我尝试修改FGallery(https://github.com/gdavis/FGallery-iPhone).我需要它从相机胶卷读取图像,但我得到内存泄漏.
旧代码(路径是文件位置):
@autoreleasepool {
NSString *path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath],_thumbUrl];
_thumbnail = [UIImage imageWithContentsOfFile:path];
_hasThumbLoaded = YES;
_isThumbLoading = NO;
[self performSelectorOnMainThread:@selector(didLoadThumbnail) withObject:nil waitUntilDone:YES];
}
Run Code Online (Sandbox Code Playgroud)
我的代码(路径是断言库url):
@autoreleasepool {
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) {
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
_thumbnail = [UIImage imageWithCGImage:iref];
_hasThumbLoaded = YES;
_isThumbLoading = NO;
[self performSelectorOnMainThread:@selector(didLoadThumbnail) withObject:nil waitUntilDone:YES];
}
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) {
NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
};
NSURL …Run Code Online (Sandbox Code Playgroud) 我是一个新的开发人员,在开始编写一个简单的字典应用程序供iPhone上的个人使用,我想知道用什么方法来控制我的单词在屏幕上显示多长时间.
我已经尝试过NSTimer,performSelector:withObject:afterDelay:但我想知道这些是否是解决问题的最简单,最有效的方法.
我不确定是否应该使用睡眠方法,NSThread sleepForTimeInterval:因为我希望在屏幕上单词列表时可以选择在应用程序中进行其他操作.
有什么指针吗?
一百万谢谢.
我刚刚意识到过早调用警报控制器的解雇会导致他们不会被解雇。例如,如果我呈现警报控制器,然后立即尝试关闭它,则只是忽略了关闭。例如
// Done in viewDidLoad
let alertController = UIAlertController(title: nil, message: "Connecting to Bubble Centerpiece...\n\n", preferredStyle: .alert)
present(alertController, animated: true, completion: nil)
alertController.dismiss(animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
使用此代码,AlertController 不会被解除。就我而言,我的解雇通常在警报控制器出现后大约 0.5 秒内被调用,并且没有被解雇。我不得不像这样手动延迟解除代码以使其工作。
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: { self.alertController.dismiss(animated: true, completion: nil)})
Run Code Online (Sandbox Code Playgroud)
我的假设是警报控制器需要一些时间才能正确设置,如果解除调用早于警报实际显示到达,则不会被解除。我想知道是否有更优雅的解决方案,而不仅仅是使用 DispatchQueue 延迟它。
我想在单击表格单元格后从嵌入在导航控制器中的表格视图选择到另一个视图控制器。我仍然希望将第二个视图控制器嵌入到同一导航控制器中。因此,我通过情节提要创建了segue。
但是,我想在点击单元格后有条件地检查是否应该执行segue。
我已经签出了shouldPerformSegueWithIdentifier满足我需要的方法,但是不幸的是,它在表单击处理程序之前执行。如果我删除情节提要segue并仅通过进行segue performSegue,则我的第二个视图控制器不再嵌入相同的导航控制器中。
有什么建议吗?
这是我的代码:
// Called on click event on table cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let app = apps[indexPath.section]
if app.state == .INSTALLED {
let inputVC = self.navigationController?.viewControllers[1] as? InputVC
inputVC?.app = app
performSegue(withIdentifier: "showAccSync", sender: self)
} else {
// show alert
}
}
Run Code Online (Sandbox Code Playgroud) 是否可以在不单独指定每种类型的情况下对上述所有类型进行扩展?
例如,这里是这样的扩展Double:
extension String {
init?(_ value: Double?) {
if let nonOpt = value {
self.init(nonOpt)
} else {
return nil
}
}
}
let nonOpt: Double = 1
let opt: Double? = 1
let string = String(opt)
print(string)
Run Code Online (Sandbox Code Playgroud)
如果可以使用原始类型初始化字符串,我想允许使用可选类型进行字符串初始化。
我正在PHP循环中构建一个小报告.我在while()循环中运行的查询是这样的:
INSERT IGNORE INTO `tbl_reporting` SET datesubmitted = '2015-05-26', submissiontype = 'email', outcome = 0, totalcount = totalcount+1
Run Code Online (Sandbox Code Playgroud)
我希望totalcount每次运行查询时列都会递增.但是数字保持为1. UNIQUE索引组成前3列.
这是表格模式:
CREATE TABLE `tbl_reporting` (
`datesubmitted` date NOT NULL,
`submissiontype` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`outcome` tinyint(1) unsigned NOT NULL DEFAULT '0',
`totalcount` mediumint(5) unsigned NOT NULL DEFAULT '0',
UNIQUE KEY `datesubmitted` (`datesubmitted`,`submissiontype`,`outcome`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)
当我将查询修改为常规UPDATE语句时:
UPDATE `tbl_reporting` SET totalcount = totalcount+1 WHERE datesubmitted = '2015-05-26' AND submissiontype = 'email' AND outcome = …Run Code Online (Sandbox Code Playgroud) 我试图在启动时在第一个视图控制器之上呈现第二个视图控制器,而不会关闭第一个视图控制器。这篇文章Swift 3 - 在启动时加载多个 ViewControllers看起来确实有答案。它建议:
添加您的主视图控制器
var secondViewController:UIViewController!
Run Code Online (Sandbox Code Playgroud)
在您的 viewDidLoad 中:
secondViewController: UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "yourIdentifier") as! SecondViewController
Run Code Online (Sandbox Code Playgroud)
就是这样。当您想展示它时,请使用:
self.present(secondViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
例如,如果我将它作为一个动作附加到按钮上,那么第三行效果很好。但是,如果它在第一个 viewController 的 viewDidLoad: 中,则它不起作用。这就是我需要的。
如何在启动时自动在第一个 viewController 之上显示第二个 viewController?
我有三种方法,其中两种同时运行.第三种方法只有在第一种和第二种方法共同完成工作时才能启动.竞争对手的第一种或第二种方法可以先完成工作.
- (void)method1 {
//DO Long Work
isMethod1Complete = YES;
[self method3];
}
- (void)method2 {
//DO Long Work
isMethod2Complete = YES;
[self method3];
}
- (void)method3 {
if (isMethod1Complete && isMethod2Complete) {
//DO Work once
}
}
Run Code Online (Sandbox Code Playgroud)
应始终调用方法3一次.但问题是有一种情况是method1和method2同时完成了工作,而method3被调用了两次.告诉我如何在iOS的目标c中解决这个问题?
更新:一个具体的例子,我有两个服务,当他们完成工作时调用代理.
- (void)method1Handler {
isMethod1Complete = YES;
[self method3];
}
- (void)method2Handler {
isMethod1Complete = YES;
[self method3];
}
Run Code Online (Sandbox Code Playgroud)
如何在没有块的情况下解决这个问题 对于街区而言,Rob的榜样是最好的.
Xcode不会让我命名我的IBOutlet"switch",因为它是一个保留的关键字:
@IBOutlet weak var switch: UISwitch!
Run Code Online (Sandbox Code Playgroud) ios ×8
swift ×4
iphone ×2
objective-c ×2
xcode ×2
cocoa ×1
cocoa-touch ×1
memory-leaks ×1
mysql ×1
php ×1
segue ×1
string ×1
swift4 ×1
timer ×1
type-systems ×1
uikit ×1
uistoryboard ×1