当用户终止应用程序(强制关闭)时,我需要进行 API 调用。我所做的直接实现如下。
在应用程序委托中,我添加了以下代码。
func applicationWillTerminate(_ application: UIApplication) {
print("________TERMINATED___________")
testAPICall()
}
func testAPICall(){
let url = getURL()
let contentHeader = ["Content-Type": "application/json"]
Alamofire.request(url,
method: .put,
parameters: ["username": "abc@xyz.com"],
encoding: JSONEncoding.default,
headers: contentHeader).responseJSON { (response) -> Void in
print("-----")
}
}
Run Code Online (Sandbox Code Playgroud)
但是,没有拨打电话。在查看文档时,我发现在此方法中完成任务只需要 5 秒钟,最重要的是,进行 api 调用不是在这里完成的任务。所以我想知道,有什么方法可以做到这一点。
我正在尝试向Google Map显示geojson图层.代码如下.geojson文件存储在我的原始文件夹中.该文件有286个功能(约15MB).因此,读取此文件并显示它会消耗更多时间.最初,我出现内存不足错误,通过在清单文件中将大堆设置为true来删除.如何快速加载此文件(目前,它需要一分钟或更长时间)?我想知道是否有其他有效的方法来做到这一点.在此之后,我还将有其他任务来获取功能并显示一些属性.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myanmar, 5.25f));
new MyAsyncTask().execute();
}
public class MyAsyncTask extends AsyncTask <Void, Void, Void> {
ProgressDialog pd;
GeoJsonLayer layer;
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(MapsActivity.this);
pd.setMessage("Loading Data");
pd.show();
}
@Override
protected Void doInBackground(Void... voids) {
try {
layer = new GeoJsonLayer(mMap, R.raw.myanmar, getApplicationContext());
} catch (Exception e) {
Log.d("Error is : …
Run Code Online (Sandbox Code Playgroud) 我的viewcontroller有一个tableview,我可以在不同的部分填充我的视图.我正在尝试向此tableview添加刷新控件.我实施的内容如下.
func setUpRefreshControl() {
let refreshControl = UIRefreshControl()
refreshControl.tintColor = UIColor.red
refreshControl.addTarget(self, action: #selector(handleRefresh(_: )), for: UIControlEvents.valueChanged)
if #available(iOS 10.0, *) {
tableView.refreshControl = refreshControl
} else {
tableView.addSubview(refreshControl)
}
}
@objc func handleRefresh(_ sender: UIRefreshControl) {
print("-----------REFRESHED------------")
}
Run Code Online (Sandbox Code Playgroud)
接下来,当我下拉tableview进行刷新时,刷新控件(设置为红色)可见.但是,不调用目标函数.
我的viewcontroller位于标签栏控制器内,该控制器嵌入在导航控制器中.我想这个问题与视图层次结构有关,因为当我在没有导航栏和标签栏的单独项目中尝试相同的代码时,它的工作正常.但我无法弄清楚当前的问题是什么.解决这个问题的任何建议?谢谢.
编辑:我在不同的模拟器中测试它:6,6s,6s +,7,7 +,8,8 +,X.我发现上面的代码在包括X在内的所有加号版本中运行良好.但是,所有模拟器都在运行ios 11.2所以我仍然无法弄清楚可能导致这个问题的原因.
uitabbarcontroller uinavigationcontroller tableview uirefreshcontrol swift
我有一个tabBar
. 它的每个选项卡ViewControllers
都嵌入在各自的NavigationControllers
.
等级制度:
Tabbarcontroller
--> NavigationController
--> VC1 --> VC2 -->...VCn(对于tab1)
当我单击推送通知时,我必须重定向到其中一个视图控制器说 VC2。我使用的代码如下。
let navigationController = UINavigationController()
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.main)
if let chatViewController = storyboard.instantiateViewController(withIdentifier: "chatViewController") as? ChatViewController {
navigationController.viewControllers = [chatViewController]
window?.rootViewController = navigationController
}
Run Code Online (Sandbox Code Playgroud)
通过使用它,我被重定向到相应的ViewController
. 但是,我无法回到tabBar
. 那么是否有可能以允许我返回标签栏的方式重定向,从而提供与 UI 中相同的层次结构?
编辑:
下图显示了我的布局。
我想完成以下工作:
当用户点击推送通知时,应用程序应被定向到 VC-B。*如果 VC-B 已经在导航堆栈的顶部,它不应该为 VC-B 创建新对象并添加到导航堆栈。
如果应用程序已终止并且用户点击通知,则应打开 VC-B。
为了确定应用程序是否已终止,我设置了一个标志:
func applicationWillTerminate(_ application: UIApplication) {
UserDefaults.standard.set(true, forKey: UserDefaultsKey.isTerminated)
}
Run Code Online (Sandbox Code Playgroud)
该标志在 didFinishLaunchingWithOptions 函数结束时设置为 false。 …
uitabbarcontroller uinavigationcontroller push-notification ios swift
对于我的应用程序中的导航功能,我使用的是Mapbox SDK.以下是我正在使用的片段.
func showNavigationMap() {
let origin = Waypoint(coordinate: currentLocation.coordinate, name: "Your Location")
guard pickUpCoordinate != nil, dropOffCoordinate != nil else {
showAlertMessage("Locations not generated")
return
}
let pickUpLocation = Waypoint(coordinate: pickUpCoordinate, name: "Pickup Location")
let deliveryLocation = Waypoint(coordinate: dropOffCoordinate, name: "Delivery Location")
let options = NavigationRouteOptions(waypoints: [origin, pickUpLocation, deliveryLocation])
Directions.shared.calculate(options) { (waypoints, routes, error) in
guard let route = routes?.first else {
self.showAlertMessage("No possible routes detected")
return
}
self.mapNavigationViewController = NavigationViewController(for: route)
self.mapNavigationViewController.delegate = self
self.present(self.mapNavigationViewController, animated: true, completion: …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 MVVM。在阅读一些关于 MVVM 的博客后,我发现它们使用了 Rx、KVO、Boxing 等数据绑定技术。以下是我使用 MVVM 验证用户的类。我没有放置任何数据绑定代码。我所做的只是在单击提交按钮时将用户名和密码从视图控制器传递到我的视图模型类。视图模型包含所有验证逻辑。最后,它将状态返回给视图控制器,视图控制器根据状态显示一些消息。我在徘徊这是要走的路还是应该使用一些数据绑定?
SignUpViewController.swift
import UIKit
class SignUpViewController: UIViewController {
let signupviewmodel = SignUpViewModel()
@IBOutlet weak var textFieldUsername: UITextField!
@IBOutlet weak var textFieldPassword: UITextField!
@IBOutlet weak var textFieldPasswordConfirm: UITextField!
@IBAction func initialSignUp(_ sender: Any) {
signupviewmodel.updateUsername(username: textFieldUsername.text!)
signupviewmodel.updatePassword(password: textFieldPassword.text!)
signupviewmodel.updateConfirmPassword(confirmpassword: textFieldPasswordConfirm.text!)
switch signupviewmodel.validateUser() {
case .Valid:
showAlert(title: "Valid", message: "success")
case .InValid(let error):
showAlert(title: "Error Validation", message: error)
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func showAlert(title: String, …
Run Code Online (Sandbox Code Playgroud) 我有一个UIAlertController:
let alert = UIAlertController(title: "Add your photo", message: "", preferredStyle: .alert)
var image = UIImage(named: "avatar.png")
image = image?.withAlignmentRectInsets(UIEdgeInsetsMake(0, view.frame.width/2 - (image?.size.width)!/2, 0, 0))
let imageAction = UIAlertAction(title: "", style: .default, handler: nil)
imageAction.setValue(image?.withRenderingMode(.alwaysOriginal), forKey: "image")
alert.addAction(imageAction)
Run Code Online (Sandbox Code Playgroud)
默认情况下,图标左对齐,我尝试使用UIEdgeInset对中心对齐(上面的第3行).考虑到左上角是原点(0,0),我试图将图像定位在水平轴的中心,左边的插入值与代码一样,但图像如下所示.所以我知道这是不正确的.我可以设法通过反复试验把它放在中心.但我想提出一种适当的方法来对齐它.实现这一目标的正确方法是什么?谢谢.
I am showing a custom pop up over my main viewcontroller. For this I have created a viewcontroller in the storyboard (image shown), the corresponding class being as below.
class PopUpViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black.withAlphaComponent(0.7)
self.showAnimate()
}
func showAnimate()
{
self.view.alpha = 1.0
}
func removeAnimate()
{
UIView.animate(withDuration: 0.0, animations: {
self.view.alpha = 0.0;
}, completion:{(finished : Bool) in
if (finished) {
self.view.removeFromSuperview()
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
Then in my main viewcontroller, I show …
我在堆栈视图中显示两个标签,如下图所示。我希望第一个标签显示其全部内容。为此,我尝试使其水平内容拥抱优先级以及其水平内容压缩阻力优先级高于其他标签。我仍然得到如图所示的裁剪标签。这不是应该工作吗?我如何得到想要的结果?堆栈视图的对齐设置为“填充”,其分布设置为“按比例填充”。
swift ×8
ios ×7
alignment ×1
android ×1
appdelegate ×1
data-binding ×1
geojson ×1
google-maps ×1
mapbox ×1
markers ×1
mvvm ×1
tableview ×1
uilabel ×1
uistackview ×1
view ×1