这可能有一个非常简单的修复,但我有一个UITableViewController在正常的列表/详细配置中调用UIViewController。
由于我在详细视图控制器中添加了2个子视图,因此第二次显示详细视图控制器时应用程序崩溃了。
我在加载视图时做了很多设置等,但是我已经完成了,我找不到任何已经设置为null的内容等等。没有任何初始化函数会使应用程序崩溃。只有在完成应用程序失败后才能完成。我假设细节视图控制器每次都进行相同的初始化...
有没有人遇到过这个?
这是调用详细视图控制器的地方:
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
/***************************************************************************************
The detail view is just sent the tank object for the selected tank. The detail view
loads the labels and gauge with the appropriate information
***************************************************************************************/
self.detailViewController = [[tankDetailViewController alloc] init];
self.detailViewController = segue.destinationViewController;
[segue.destinationViewController setTankToShow:self.selectedTank];
}
以下是detailviewcontroller的代码:
@interface tankDetailViewController () <iTanksV2ListViewControllerDelegate>
//@property (nonatomic, strong) tankReleasedProductListTVCViewController* releasedProductList;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *tankGaugeHeightConstraint;
@property (weak, nonatomic) IBOutlet UIView *tankDetailView;
@property (weak, nonatomic) IBOutlet UIView *tankTrendView;
@property (nonatomic, strong) CPTGraphHostingView* hostView;
@property (strong, nonatomic) CPTGraph* graph;
@property BOOL isFirstValue;
@property double startValue;
@property double lastValue;
@end
@implementation tankDetailViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
/*************************************************************************************
All we need to do here, is to display all the information from the tank object in the
labels in the view.
The only thing of note is that we convert the volumes to doubles, and then use them to
calculate the percentFilled property of the tankGauge object.
************************************************************************************/
[super viewDidLoad];
self.isFirstValue = YES;
self.tankNumberLabel.text = [@"T" stringByAppendingString: self.tankToShow.tankNumber];
self.tankAvailableProductLabel.text = self.tankToShow.tankPumpableVolume;
self.tankProductLabel.text = self.tankToShow.tankProduct.name;
self.tankMaxVolumeLabel.text = self.tankToShow.tankMaxVolume;
self.tankGaugeHeightConstraint.constant = ([self.tankToShow.tankTotalVolume doubleValue]/[self.tankToShow.tankMaxVolume doubleValue]) * self.tankGaugeScaleView.frame.size.height;
self.tankTotalVolumeLabel.text = self.tankToShow.tankTotalVolume;
self.tankProductCode.text = self.tankToShow.tankProduct.code;
self.tankStatusLabel.text = self.tankToShow.tankStatus;
if([self.tankToShow.tankStatus isEqualToString:@"Process"])
{
[self.tankStatusLED setImage:[UIImage imageNamed:@"red_btn.png"] forState:UIControlStateNormal];
}
else if([self.tankToShow.tankStatus isEqualToString:@"Release"])
{
[self.tankStatusLED setImage:[UIImage imageNamed:@"green_btn.png"] forState:UIControlStateNormal];
}
else if([self.tankToShow.tankStatus isEqualToString:@"For Test"])
{
[self.tankStatusLED setImage:[UIImage imageNamed:@"amber_btn.png"] forState:UIControlStateNormal];
} else
{
[self.tankStatusLED setImage:[UIImage imageNamed:@"grey_btn.png"] forState:UIControlStateNormal];
}
[self.view bringSubviewToFront:self.tankDetailView];
self.graphData = [TrendData getTrendDataForTank];
[self initPlot];
}
- (void)viewWillAppear:(BOOL)animated
{
[self.view bringSubviewToFront:self.tankDetailView];
}
-(void) viewDidDisappear:(BOOL)animated
{
}
- (void) initPlot
{
[self configureHost];
[self configureGraph];
[self configurePlots];
[self configureAxes];
}
- (void) configureHost
{
self.hostView = [(CPTGraphHostingView*) [CPTGraphHostingView alloc] initWithFrame:self.tankTrendView.bounds];
self.hostView.allowPinchScaling = NO;
[self.tankTrendView addSubview:self.hostView];
}
- (void) configureGraph
{
self.graph = [[CPTXYGraph alloc] initWithFrame:self.hostView.bounds];
[self.graph applyTheme:[CPTTheme themeNamed:kCPTPlainWhiteTheme]];
self.hostView.hostedGraph = self.graph;
self.graph.title = [@"Trend Graph for " stringByAppendingString:self.tankNumberLabel.text];
CPTMutableTextStyle* titleStyle = [CPTMutableTextStyle textStyle];
titleStyle.color = [CPTColor blackColor];
titleStyle.fontName = @"Helvetica-Neue Light";
titleStyle.fontSize = 10.0f;
self.graph.titleTextStyle = titleStyle;
self.graph.titlePlotAreaFrameAnchor = CPTRectAnchorTop;
self.graph.titleDisplacement = CGPointMake(0.0f, 20.0f);
[self.graph.plotAreaFrame setPaddingLeft:50.0f];
[self.graph.plotAreaFrame setPaddingBottom:90.0f];
CPTXYPlotSpace* plotSpace = (CPTXYPlotSpace*) self.graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
self.graph.defaultPlotSpace.delegate = self;
self.graph.delegate = self;
}
- (void) configurePlots
{
CPTGraph* graph = self.hostView.hostedGraph;
CPTXYPlotSpace* plotSpace = (CPTXYPlotSpace*) graph.defaultPlotSpace;
CPTScatterPlot* aaplPlot = [[CPTScatterPlot alloc] init];
aaplPlot.dataSource = self;
CPTColor *aaplColor = [CPTColor redColor];
aaplPlot.delegate = self;
aaplPlot.plotLineMarginForHitDetection = 10;
aaplPlot.plotSymbolMarginForHitDetection = 10;
[graph addPlot:aaplPlot toPlotSpace:plotSpace];
[plotSpace scaleToFitPlots: [NSArray arrayWithObjects:aaplPlot, nil]];
CPTMutablePlotRange* xRange = [plotSpace.xRange mutableCopy];
[xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.2f)];
plotSpace.xRange = xRange;
CPTMutablePlotRange* yRange = [plotSpace.yRange mutableCopy];
[xRange expandRangeByFactor:CPTDecimalFromCGFloat(1.2f)];
plotSpace.yRange = yRange;
CPTMutableLineStyle* aapleLineStyle = [aaplPlot.dataLineStyle mutableCopy];
aapleLineStyle.lineWidth = 2.5;
aapleLineStyle.lineColor = aaplColor;
aaplPlot.dataLineStyle = aapleLineStyle;
}
- (void) configureAxes
{
NSDate* refDate = [NSDate dateWithTimeIntervalSince1970:0];
CPTGraph* graph = self.hostView.hostedGraph;
CPTXYAxisSet* axes = (id)graph.axisSet;
CPTXYPlotSpace* plotSpace = (CPTXYPlotSpace*) self.graph.defaultPlotSpace;
axes.xAxis.minorTicksPerInterval = 0;
NSValue* firstValue = [self.graphData objectAtIndex:0];
NSValue* lastValue = [self.graphData objectAtIndex:self.graphData.count -1];
CGPoint firstPoint = [firstValue CGPointValue];
CGPoint lastPoint = [lastValue CGPointValue];
axes.yAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(plotSpace.xRange.minLimitDouble);
axes.yAxis.majorIntervalLength = CPTDecimalFromDouble(plotSpace.yRange.lengthDouble/5);
axes.yAxis.minorTicksPerInterval = 0;
axes.xAxis.orthogonalCoordinateDecimal = CPTDecimalFromDouble(plotSpace.yRange.minLimitDouble);
axes.xAxis.majorIntervalLength = CPTDecimalFromDouble((lastPoint.x - firstPoint.x)/3);
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [NSLocale currentLocale];
dateFormatter.dateFormat = @"dd/MM/yyyy HH:mm:ss";
CPTTimeFormatter *timeFormatter = [[CPTTimeFormatter alloc] initWithDateFormatter:dateFormatter];
timeFormatter.referenceDate = refDate;
axes.xAxis.labelFormatter = timeFormatter;
}
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if (fromInterfaceOrientation==UIInterfaceOrientationPortrait || fromInterfaceOrientation==UIInterfaceOrientationPortraitUpsideDown)
{
self.hostView.frame = self.view.bounds;
[self.graph reloadData];
[self.view bringSubviewToFront:self.tankTrendView];
}
else
{
self.hostView.frame = self.view.bounds;
[self.graph reloadData];
[self.view bringSubviewToFront:self.tankDetailView];
}
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (IBAction)didPressTankStatusLED:(UIButton *)sender {
//if([self.tankToShow.tankStatus isEqualToString:@"Release"])
//{
/*self.releasedProductList = [[tankReleasedProductListTVCViewController alloc] initWithStyle:UITableViewStylePlain];
Product* releasedProduct = [[Product alloc] init];
releasedProduct.name = self.tankProductLabel.text;
releasedProduct.code = self.tankProductCode.text;
self.releasedProductList.productList = [NSArray arrayWithObjects:releasedProduct, nil];
FPPopoverController* popoverController = [[FPPopoverController alloc]initWithViewController:self.releasedProductList];
self.releasedProductList.delegate = self;
popoverController.contentSize = CGSizeMake(250, 85 * self.releasedProductList.productList.count);
[popoverController presentPopoverFromView:self.tankStatusLED];*/
//}
}
- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
{
return self.graphData.count;
}
- (id)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)idx
{
NSValue *value = [self.graphData objectAtIndex:idx];
CGPoint point = [value CGPointValue];
// FieldEnum determines if we return an X or Y value.
if ( fieldEnum == CPTScatterPlotFieldX )
{
return [NSNumber numberWithFloat:point.x];
}
else // Y-Axis
{
return [NSNumber numberWithFloat:point.y];
}
}
- (void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index
{
}
//This function is here to lock the graph and prevent it from being panned so I can use the the drag event for my own purposes
-(CGPoint)plotSpace:(CPTPlotSpace *)space willDisplaceBy:(CGPoint)displacement {
return CGPointMake(0, 0);
}
- (BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(UIEvent *)event atPoint:(CGPoint)point
{
return NO;
}
- (BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(UIEvent *)event atPoint:(CGPoint)point
{
CPTGraph* graph = self.hostView.hostedGraph;
CPTXYAxisSet* axes = (id)graph.axisSet;
double percentAcrossScreen = point.x/self.view.frame.size.width;
if (self.isFirstValue==YES)
{
self.startValue = percentAcrossScreen;
self.isFirstValue = NO;
}
else
{
self.lastValue = percentAcrossScreen;
}
NSValue *firstValue = [self.graphData objectAtIndex:[[NSNumber numberWithDouble:self.startValue * self.graphData.count] integerValue]];
CGPoint firstPoint = [firstValue CGPointValue];
NSValue *lastValue = [self.graphData objectAtIndex:[[NSNumber numberWithDouble:self.lastValue * self.graphData.count] integerValue]];
CGPoint lastPoint = [lastValue CGPointValue];
double difference = lastPoint.x - firstPoint.x;
CPTPlotRange *range = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(firstPoint.x)
length:CPTDecimalFromDouble(difference)];
CPTFill *bandFill = [CPTFill fillWithColor:[CPTColor blueColor]];
[axes.yAxis addBackgroundLimitBand:[CPTLimitBand limitBandWithRange:range
fill:bandFill]];
NSLog([[NSNumber numberWithDouble:firstPoint.x] stringValue]);
NSLog([[NSNumber numberWithDouble:lastPoint.x] stringValue]);
return YES;
}